`
lesorb
  • 浏览: 124512 次
  • 性别: 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反射,获取所有属性、方法以及List集合类

    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反射机制的重要应用场景之一。通过`Class.forName()`方法或者`ClassLoader`的`loadClass()`方法,可以根据类名字符串在运行时加载类。 #### 七、操作成员 - **创建对象**:使用`Class`对象的`new...

    通过Java反射机制获取JavaBean对象

    1.通过Java反射机制获取JavaBean对象。 2.通过JavaBean全路径字符串获取JavaBean对象。 3.获取JavaBean注解信息

    Java反射经典实例

    Java反射是Java编程语言中的一个强大特性,它允许运行时的程序访问并操作类、接口、字段和方法等信息,即使这些信息在编译时并未明确知晓。在Java中,反射通常通过`java.lang.Class`类和相关的API来实现。本实例将...

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

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

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

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

    java反射源代码

    Java反射是Java编程语言中的一个强大特性,它允许在运行时检查类、接口、字段和方法的信息,并且能够在运行时动态地创建对象和调用方法。这个特性使得Java具有高度的灵活性,尤其在处理框架、插件系统以及元数据驱动...

    java反射.pdf

    ### Java反射机制详解 #### 一、什么是Java反射? Java反射是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反射获取所有属性,获取所有get方法,包括子类父类

    Java反射是Java编程语言中的一个强大工具,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射主要用于在运行时分析类和对象,包括访问私有成员、调用私有方法、创建动态代理等。...

    Java反射案例

    Java反射是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射机制的核心类集中在java.lang.reflect包下,包括Class、Constructor、Method和Field...

    Java 反射创建get set方法及反射方法的调用

    ### Java反射创建get set方法及反射方法的调用 #### 概述 在Java编程语言中,反射(Reflection)是一种强大的技术,它允许程序在运行时检查类、接口、字段和方法的信息,并能够动态地创建对象和调用方法。本文将...

Global site tag (gtag.js) - Google Analytics