`
wuxing429
  • 浏览: 16089 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
社区版块
存档分类
最新评论

java反射复习(一)

阅读更多
   反射本身并不是一个新概念,尽管计算机科学赋予了反射概念新的含义。在计算机科学领域,反射是指一类应用,它们能够自描述和自控制。也就是说,这类应用通过采用某种机制来实现对自己行为的描述(self-representation)和监测(examination),并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义。
  java.lang.reflection中的主要类 主要如下:
    1、Constructor<T> 提供关于类的单个构造方法的信息以及对它的访问权限。 Constructor      允许在将实参与带有基础构造方法的形参的 newInstance() 匹配时进行扩展转换,但是如果发生收缩转换,则抛出 IllegalArgumentException。newInstance(Object... initargs) 使用此 Constructor 对象表示的构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例。
    2、Field 提供有关类或接口的单个字段的信息,以及对它的动态访问权限。反射的字段可能是一个类(静态)字段或实例字段。
    3、Method 提供关于类或接口上单独某个方法(以及如何访问该方法)的信息。所反映的方法可能是类方法或实例方法(包括抽象方法)。 Method 允许在匹配要调用的实参与基础方法的形参时进行扩展转换;但如果要进行收缩转换,则会抛出 IllegalArgumentException。
    4、Modifier 类提供了 static 方法和常量,对类和成员访问修饰符进行解码。修饰符集被表示为整数,用不同的位位置 (bit position) 表示不同的修饰符。
    5、Proxy 提供用于创建动态代理类和实例的静态方法,它还是由这些方法创建的所有动态代理类的超类。 创建某一接口 Foo 的代理:
   
 InvocationHandler handler = new MyInvocationHandler(...);
     Class proxyClass = Proxy.getProxyClass(
         Foo.class.getClassLoader(), new Class[] { Foo.class });
     Foo f = (Foo) proxyClass.
         getConstructor(new Class[] { InvocationHandler.class }).
         newInstance(new Object[] { handler });

或使用以下更简单的方法:
   
 Foo f = (Foo) Proxy.newProxyInstance(Foo.class.getClassLoader(),
                                          new Class[] { Foo.class },
                                          handler);

动态代理类(以下简称为代理类)是一个实现在创建类时在运行时指定的接口列表的类,该类具有下面描述的行为。 代理接口 是代理类实现的一个接口。 代理实例 是代理类的一个实例。 每个代理实例都有一个关联的调用处理程序 对象,它可以实现接口 InvocationHandler。通过其中一个代理接口的代理实例上的方法调用将被指派到实例的调用处理程序的 Invoke 方法,并传递代理实例、识别调用方法的 java.lang.reflect.Method 对象以及包含参数的 Object 类型的数组。调用处理程序以适当的方式处理编码的方法调用,并且它返回的结果将作为代理实例上方法调用的结果返回。
   6、Array 类提供了动态创建和访问 Java 数组的方法。Array 允许在执行 get 或 set 操作期间进行扩展转换,但如果发生收缩转换,则抛出 IllegalArgumentException。

取得类名(接口)、方法名、属性名
 package taobao.com;

import java.lang.reflect.Field;

public class ReflectionTest {
    
	public static void main(String arg[]){
		Class<A> c = A.class;
		System.out.println(c.getName());
	    Field [] fields =	c.getFields();
	    Field [] declaredFields =	c.getDeclaredFields();
	    //只有public属性在Field[]中
	    for(Field f : fields){
	    	System.out.println(f.getName());
	    }
	    //私有变得都会在数组中
	    for(Field f:declaredFields)	{
	    	System.out.println(f.getName());
	    }
	}
}

class A {
	
	private int x;
	private String y;
	
	public String z;
	
	public int getX() {
		return x;
	}
	public void setX(int x) {
		this.x = x;
	}
	public String getZ() {
		return z;
	}
	public void setZ(String z) {
		this.z = z;
	}
	public String getY() {
		return y;
	}
	public void setY(String y) {
		this.y = y;
	}
    public int add(int t){
    	return x + t;
    }
}
  

反射重写tosring方法
public String toString(){
		StringBuffer bufferStr = new StringBuffer();
		Class<? extends A> c = this.getClass();
		int m = c.getModifiers();
		Field [] fields = c.getDeclaredFields();
		for(Field f : fields){
			Object o = null ;
			try {
				o = f.get(this);
			} catch (IllegalArgumentException e) {
				e.printStackTrace();
			} catch (IllegalAccessException e) {
				e.printStackTrace();
			}
			if( Modifier.isStatic(m) || Modifier.isFinal(m) ){
				continue;
			}else if(o != null ){
				bufferStr.append(f.getName()+":" +o.toString());
				bufferStr.append("     ");
			}
		}	
		return bufferStr.toString();
	}


显示类中的所有方法代码

		Class<A> c = A.class;
		Method[] m = c.getDeclaredMethods();
		for (int i = 0; i < m.length; i++) {
			// 输出方法的返回类型
			System.out.print(m[i].getReturnType().getName());
			// 输出方法名
			System.out.print(" " + m[i].getName() + "(");
			// 获取方法的参数
			Class[] parameterTypes = m[i].getParameterTypes();
			for (int j = 0; j < parameterTypes.length; j++) {
				System.out.print(parameterTypes[j].getName());
				if (parameterTypes.length > j + 1) {
					System.out.print(",");
				}
			}
			System.out.println(")");
		}


把DO转化成map
public Map<String, String> toMap(String[] ignoreFiled) {
		Map<String, String> map = new HashMap<String, String>();
		try {
			Class f = this.getClass();
			Field[] fields = f.getDeclaredFields();
			for(int i=0,len=fields.length;i<len;i++){
				String name = fields[i].getName();
				Object o = fields[i].get(this);
				
				//排除静态常量
				if(null != o 
						&& !Modifier.isFinal(fields[i].getModifiers()) 
						&& !Modifier.isStatic(fields[i].getModifiers())
						&& !ArrayUtil.contains(ignoreFiled, name)){
					String property = BeanUtils.getProperty(this, name);
					if(StringUtil.isBlank(property)) {						
						continue ;
					}
					
					map.put(name, property);
				}
			}
		} catch (Exception e) {
		}
		
		return map;
	}
分享到:
评论

相关推荐

    Java SE 复习资料

    8. **反射API**:Java反射API允许在运行时检查类的信息,创建和访问对象,调用方法。虽然不常用,但在某些场合(如插件系统、序列化、动态代理)是必不可少的。 9. **泛型**:泛型是Java 5引入的新特性,用于增强...

    JAVA书本复习题答案整合

    "JAVA书本复习题答案整合"是一个精心整理的资源包,它集合了多套Java书本复习题目及其对应的答案,旨在帮助学习者高效地备考期末考核。 1. **Java基础知识**:复习题可能涵盖了Java的基础语法,如变量、数据类型、...

    java_复习题库java_复习题库

    这个“java_复习题库”包含了丰富的学习资料,旨在帮助学习者巩固Java编程的知识点,提升技能水平。以下是一些核心的Java编程知识点,通过复习题库可以深入理解和掌握: 1. **基础语法**:Java的基础包括变量、数据...

    java 考试复习资料

    以上只是Java编程的一些基础知识点,实际考试中可能还会涉及到更深入的理论,如设计模式、并发编程、反射、注解、JVM工作原理等。通过反复练习和实践,才能更好地掌握Java编程技能,并顺利通过考试。

    Java期末复习——枚举与反射机制

    总结来说,枚举提供了一种安全的方式来定义一组常量,而反射机制则赋予了Java程序在运行时探索和操作类的能力,这两者都是Java强大特性的体现。在实际开发中,理解并合理运用枚举和反射,能够提升代码的灵活性和可...

    java复习题3

    7. **反射**: 反射允许我们在运行时动态地获取类的信息(如类名、属性、方法)并进行操作,是Java的高级特性之一。理解Class类、Constructor、Method、Field等反射API的使用是复习的重要内容。 8. **泛型**: 泛型...

    Java复习资料及例题源代码

    Java反射机制允许程序在运行时动态获取类的信息并操作对象,而注解则是提供元数据的一种方式。复习资料会介绍如何使用反射创建、访问类和对象,以及注解的使用和自定义。 九、Java EE相关 如果内容涉及Java企业版,...

    java面试复习资料

    ### Java面试复习资料详解 #### 一、内存泄漏与内存溢出 - **内存泄漏**:指程序在申请内存后,无法释放已分配的内存空间,导致随着时间的推移,程序所消耗的内存逐渐增加。这通常是因为程序员未能正确地管理内存...

    java复习.zip

    "java复习.zip"这个压缩包包含了一份全面的Java复习资源,涵盖了Java基础知识、面试笔试题、逻辑题以及各大公司的Java题目,还特别提到了SSH框架,即Struts、Spring和Hibernate这三个流行框架的综合应用。...

    java面试复习资料.pdf

    Java面试复习资料涵盖了众多核心知识点,对于准备Java面试的求职者来说是不可或缺的参考资料。以下是一些关键点的详细解析: 1. **面向对象**:Java是一种面向对象的语言,其三大特性是封装、继承和多态。面试中常...

    Java基础考试复习资料

    11. **反射机制**:Java反射允许在运行时动态地获取类的信息并操作类的对象,包括Class类的使用、newInstance()、getMethod()、getField()等方法。 12. **泛型**:泛型引入了类型参数的概念,增强了代码的类型安全...

    JAVA课程总复习

    首先,我们关注的是"PPT_JAVA总复习.ppt",这是一个精心制作的PowerPoint演示文稿,通常会包含清晰的结构,帮助学习者逐步梳理Java的核心概念。此PPT可能包括以下几个方面: 1. **Java简介**:介绍Java的历史、特点...

    Java基础复习

    14. **反射机制**:Java的反射API允许程序在运行时动态访问类、接口、字段和方法的信息,实现动态调用方法,增强了程序的灵活性。 15. **枚举类型**:Java 5引入了枚举,用于表示固定集合的值。枚举类可以拥有方法...

    JAVA复习ppt

    9. **反射机制**:Java的反射机制允许程序在运行时动态获取类的信息(如类名、方法名)并调用,增强了程序的灵活性。 10. **垃圾回收**:Java的自动内存管理机制,通过垃圾回收器自动回收不再使用的对象,防止内存...

    java入门复习题对刚刚入门的新手 肯定有用

    Java是一种广泛使用的面向对象的编程语言,以其跨平台性、高效性和安全性著称。对于刚刚入门的新手来说,掌握Java的基础知识是至关重要的。以下是一些关键的学习点,这些知识点在"java入门复习题"中可能会涉及到: ...

    北大青鸟 S1 java总复习资料

    6. **反射**: 了解Java反射机制,学习Class类的使用,动态获取类的信息,实例化对象,调用私有方法,以及修改私有变量等。 7. **JDBC数据库操作**: 学习连接数据库、执行SQL语句、处理结果集,理解预编译语句...

    java程序语言设计第十版复习题答案

    下面,我们将详细探讨Java的一些关键知识点,以及这些复习题可能涵盖的内容。 1. **基础语法**:Java是一种静态类型的面向对象语言,其语法严谨。复习题可能包括变量声明、数据类型(如int、float、char、boolean)...

    java期末复习13题及答案

    Java是世界上最流行的编程语言之一,尤其在企业级应用开发领域占据主导地位。期末复习对于学习Java的学生来说至关重要,因为这能帮助他们巩固所学知识,为考试做好充分准备。本资料包包含了“java期末复习13题及答案...

    Java经典复习资料

    每个"java复习题"文档可能分别专注于以上某一或多个主题,通过解答这些题目,开发者可以全面地回顾和巩固Java知识,为实际项目开发打下坚实基础。在学习过程中,结合实例和实践是加深理解的关键。希望这份复习资料能...

    达内 corejava课程源码及每日课程复习文档

    7. **反射机制**:Java反射机制允许在运行时动态获取类的信息并操作类的对象,是Java的高级特性之一,常用于插件开发、动态代理等场景。 8. **JVM内存模型**:理解Java虚拟机的工作原理,特别是内存区域(如堆、栈...

Global site tag (gtag.js) - Google Analytics