`
lesorb
  • 浏览: 123361 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java反射之ObjectAnalyzer

    博客分类:
  • java
阅读更多
JAVA2中关于反射的应用主要是用来分析类结构,其中的Field,Method,Constructor类分别描述类的字段,方法和构造器。它们又分别读有相应的getName,getType,getModifiers等方法来返回其类信息。
类ObjectAnalyzerTest:


package cn.lesorb;

import java.text.NumberFormat;
import java.util.ArrayList;

public class ObjectAnalyzerTest {
	public static void main(String[] args) 
	{
		ObjectAnalyzer objAnalyzer = new ObjectAnalyzer();
		Object obj = NumberFormat.getCurrencyInstance();
		
		System.out.println(objAnalyzer.toString(obj));
		
		ArrayList<Object> al = objAnalyzer.visited;
		for(int i=0;i<al.size();i++) {
			System.out.println(al.get(i));
		}
		
	}
}

类ObjectAnalyzer:
import java.lang.reflect.AccessibleObject;
import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.ArrayList;

class ObjectAnalyzer{

	@SuppressWarnings("unchecked")
	public String toString(Object obj){
	/*
	*
	*	Converts an object to a string representation that lists all fields
	*
	*/
	if(obj==null)   return "null"; 
	if(visited.contains(obj))  return "..."; 

	visited.add(obj);
	Class c1=obj.getClass();
	
	if(c1==String.class){
		return (String)obj;
	}
	
	if(c1.isArray()){
		
		String r=c1.getComponentType()+"[]{";
	  
		for(int i=0;i<Array.getLength(obj);i++){
	     if(i>0){
	    	 r+=",";
	     }
	     
	     Object val=Array.get(obj,i);
	     if(c1.getComponentType().isPrimitive()){
	    	 r+=val;
	     } else{
	    	 r+=toString(val);
	     }
	    }
		return r+"}";
	   }
	
	   String r=c1.getName();
	   
	   do{
		   
	    r+="[";
	    Field[] fields=c1.getDeclaredFields();
	    AccessibleObject.setAccessible(fields,true);
	    for(Field f:fields){
	    	if(!Modifier.isStatic(f.getModifiers())){
	    		if(!r.endsWith("[")){
	    			r+=",";
	    		}
	    	r+=f.getName()+"=";
	    	
	      try {
	    	  
	       Class t=f.getType();
	       Object val=f.get(obj);
	       
	       if(t.isPrimitive()){
	    	   r+=val;
	       } else {
	    	   r+=toString(val);
	       }
	      } catch(Exception e) {
	    	  e.printStackTrace();
	      }
	     }
	    }
	    
	    r+="]";
	    c1=c1.getSuperclass();
	    
	   }
	   
	   while(c1!=null);
	   return r;
	   
	}
	
	ArrayList<Object> visited=new ArrayList<Object>();
	
}

打印输出:
java.text.DecimalFormat@774c1
0
[C@156ee8e
HALF_EVEN
HALF_EVEN


-¥

'-'¤
java.text.DecimalFormatSymbols@1073a

?
CNY
E
zh_CN
zh
CN
CNY
分享到:
评论
3 楼 chaojijing_02 2011-04-10  
-¥

'-'¤
这些是怎么出来的。
2 楼 Technoboy 2011-04-10  
稍微解释一下就好了...
1 楼 peterwei 2011-04-10  
lesorb 写道
JAVA2中关于反射的应用主要是用来分析类结构,其中的Field,Method,Constructor类分别描述类的字段,方法和构造器。它们又分别读有相应的getName,getType,getModifiers等方法来返回其类信息。


package cn.lesorb;

import java.text.NumberFormat;
import java.util.ArrayList;

public class ObjectAnalyzerTest {
	public static void main(String[] args) 
	{
		ObjectAnalyzer objAnalyzer = new ObjectAnalyzer();
		Object obj = NumberFormat.getCurrencyInstance();
		
		System.out.println(objAnalyzer.toString(obj));
		
		ArrayList<Object> al = objAnalyzer.visited;
		for(int i=0;i<al.size();i++) {
			System.out.println(al.get(i));
		}
		
	}
}


import java.lang.reflect.AccessibleObject;
import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.ArrayList;

class ObjectAnalyzer{

	@SuppressWarnings("unchecked")
	public String toString(Object obj){
	/*
	*
	*	Converts an object to a string representation that lists all fields
	*
	*/
	if(obj==null)   return "null"; 
	if(visited.contains(obj))  return "..."; 

	visited.add(obj);
	Class c1=obj.getClass();
	
	if(c1==String.class){
		return (String)obj;
	}
	
	if(c1.isArray()){
		
		String r=c1.getComponentType()+"[]{";
	  
		for(int i=0;i<Array.getLength(obj);i++){
	     if(i>0){
	    	 r+=",";
	     }
	     
	     Object val=Array.get(obj,i);
	     if(c1.getComponentType().isPrimitive()){
	    	 r+=val;
	     } else{
	    	 r+=toString(val);
	     }
	    }
		return r+"}";
	   }
	
	   String r=c1.getName();
	   
	   do{
		   
	    r+="[";
	    Field[] fields=c1.getDeclaredFields();
	    AccessibleObject.setAccessible(fields,true);
	    for(Field f:fields){
	    	if(!Modifier.isStatic(f.getModifiers())){
	    		if(!r.endsWith("[")){
	    			r+=",";
	    		}
	    	r+=f.getName()+"=";
	    	
	      try {
	    	  
	       Class t=f.getType();
	       Object val=f.get(obj);
	       
	       if(t.isPrimitive()){
	    	   r+=val;
	       } else {
	    	   r+=toString(val);
	       }
	      } catch(Exception e) {
	    	  e.printStackTrace();
	      }
	     }
	    }
	    
	    r+="]";
	    c1=c1.getSuperclass();
	    
	   }
	   
	   while(c1!=null);
	   return r;
	   
	}
	
	ArrayList<Object> visited=new ArrayList<Object>();
	
}



你这也太搞了,什么说明都没有。场景和应用。

相关推荐

    java反射 java反射 java反射java反射

    Java反射是Java编程语言中的一个重要特性,它允许程序在运行时动态地获取类的信息并操作类的对象。在Java中,反射机制提供了强大的能力,包括在运行时检查类的结构、创建对象实例、调用方法以及访问和修改字段值。...

    java反射机制.zip

    java反射机制java反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制...

    Java反射性能测试分析

    ### Java反射性能测试分析 #### 引言 Java反射机制是Java编程语言中一个强大的特性,它允许程序在运行时动态地访问、检测和修改类、接口、字段和方法等对象。然而,反射操作通常会引入额外的开销,这在性能敏感的...

    JAVA反射机制的入门代码

    Java反射机制是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。这个特性使得Java具有了高度的灵活性和动态性,尤其是在处理元数据、创建对象、调用私有方法...

    Java反射机制总结

    ### Java反射机制总结 #### 反射的概念与起源 反射的概念最早由Smith于1982年提出,指的是程序能够访问、检测并修改其自身状态或行为的能力。这一概念的提出迅速引起了计算机科学领域的广泛关注,并在之后的研究中...

    Java反射 JavaBean对象自动生成插入,更新,删除,查询sql语句操作.docx

    "Java反射 JavaBean 对象自动生成插入、更新、删除、查询sql语句操作" Java反射JavaBean对象自动生成插入、更新、删除、查询sql语句操作是指通过Java反射机制,依据提供的表名、POJO类型、数据对象自动生成sql语句...

    java之反射优化(缓存思路)源码

    在Java编程中,反射(Reflection)是一个强大的工具,它允许我们在运行时检查和操作类、接口、字段和方法。然而,反射操作通常比直接的Java代码执行慢,因为它涉及到动态类型检查和方法调用。因此,为了提高性能,...

    java反射.pdf

    ### Java反射机制详解 #### 一、什么是Java反射? Java反射是Java编程语言的一个特性,它允许运行时检查和操作程序结构(类、字段、方法等)。反射的主要用途包括但不限于:动态实例化对象、访问私有成员、调用...

    北大青鸟java反射机制

    总之,Java反射机制是Java程序员必备的技能之一,它提供了对程序运行时类型信息的访问和操作,极大地扩展了Java代码的灵活性和可扩展性。通过深入学习和实践,我们可以更好地理解和利用这一强大的工具。

    Java反射机制Demo

    ### Java反射机制详解 #### 一、什么是Java反射机制? Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的...

    Java反射简单例子

    Java反射是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射机制主要用到了java.lang.Class、java.lang.reflect.Method、java.lang.reflect....

    java反射机制文档及代码

    Java反射机制是Java编程语言中一个强大的特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。这个特性使得Java具有了高度的灵活性和动态性,尤其是在处理元数据、创建对象、调用方法以及...

    JAVA反射简单例子

    Java反射是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Spring框架中,反射扮演着核心角色,特别是在依赖注入(DI)和面向切面编程(AOP)中。下面我们...

    Java 反射-动态代理

    Java反射和动态代理是Java编程中的重要特性,它们在实现高度灵活和动态的代码执行上发挥着关键作用。本文将深入探讨这两个概念,以及如何在实际开发中利用它们。 首先,我们来理解Java反射(Reflection)。Java反射...

    实战java反射机制-让你迅速认识java强大的反射机制

    Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、字段和方法的信息,甚至动态地创建对象并调用其方法。通过反射,开发者可以实现高度灵活和动态的代码,这对于框架开发、元编程...

    java 反射的使用

    Java反射是Java编程语言中的一个强大工具,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射机制的核心类是`java.lang.Class`,它代表了类的信息。通过反射,我们可以动态地...

    java反射经典实例

    Java反射是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在本“Java反射经典实例”中,我们将深入探讨这个主题,了解如何利用反射来访问和修改私有属性以及...

    JAVA反射机制动态调用 计算器对象的加法,减法函数;JAVA反射机制修改一个学生对象 的私有数据成员

    Java反射机制是Java语言提供的一种强大功能,它允许我们在运行时检查类、接口、字段和方法的信息,并且能够在运行时动态地创建对象和调用方法。这个机制在处理不确定类型或者需要灵活操作类的场景中非常有用。在这个...

    java反射实例代码

    Java反射是Java编程语言中的一个重要特性,它允许运行时的程序访问、操作和修改自身的行为。这个特性使得Java具有了动态性,可以实现元编程,即在程序运行时检查类的信息,创建和调用对象的方法,甚至修改类的结构。...

Global site tag (gtag.js) - Google Analytics