Java 反射和代理

来源:互联网 发布:代挂app源码 编辑:程序博客网 时间:2024/05/07 08:33

反射介绍

1. 要想使用反射,首先需要获得待处理类或对象所对应的Class对象。

2. 获取某个类或某个对象所对应的Class对象的常用的3种方式:

a) 使用Class类的静态方法forName:Class.forName(“java.lang.String”);

b) 使用类的.class语法:String.class;

c) 使用对象的getClass()方法:String s = “aa”; Class<?> clazz = s.getClass();

3. 若想通过类的不带参数的构造方法来生成对象,我们有两种方式:

a) 先获得Class对象,然后通过该Class对象的newInstance()方法直接生成即可:

Class<?> classType = String.class;

Object obj = classType.newInstance();

b) 先获得Class对象,然后通过该对象获得对应的Constructor对象,再通过该Constructor对象的newInstance()方法生成:

Class<?> classType = Customer.class;

Constructor cons = classType.getConstructor(new Class[]{});

Object obj = cons.newInstance(new Object[]{});

4. 若想通过类的带参数的构造方法生成对象,只能使用下面这一种方式:

Class<?> classType = Customer.class;

Constructor cons = classType.getConstructor(newClass[]{String.class, int.class});

Object obj = cons.newInstance(newObject[]{“hello”, 3});

5. Integer.TYPE返回的是int,而Integer.class返回的是Integer类所对应的Class对象。


Java类反射中的主要方法

在JDK(从jdk1.1开始)中,主要由以下类来实现java反射机制,这些类都是位于java.lang.reflect包中:

    (1)Class类:代表一个类。

    (2)Field类:代表类的成员变量(成员变量也称为类的属性)

    (3)Method类:代表类的方法

    (4)Constructor类:代表类的构造方法

    (5)Array类:提供类动态创建数组,以及访问数组元素的静态方法


安全性和反射

Java编程语言定义一种多级别方法来处理反射的安全性。基本模式是对反射实施与应用于源代码接入相同的限制:

       从任意位置到类公共组件的接入

       类自身外部无任何到私有组件的接入

       受保护和打包(缺省接入)组件的有限接入

我们可以在我们所写的类中,扩展一个普通的基本类java.lang.reflect.AccessibleObject 类。这个类定义了一种setAccessible方法,使我们能够启动或关闭对这些类中其中一个类的实例的接入检测.唯一的问题在于如果使用了安全性管理器,它将检测正在关闭接入检测的代码是否许可了这样做.如果未许可,安全性管理器抛出一个例外。

如:

对于访问修饰符为private的方法,直接调用method.invoke() 会报错

method.setAccessible(true);//压制java的访问控制检查


ClassType 类对象的方法

* getFields()与getDeclaredFields()区别:getFields()只能访问类中声明为公有的字段,私有的字段它无法访问.getDeclaredFields()能访问类中所有的字段,与public,private,protect无关 

* getMethods()与getDeclaredMethods()区别:getMethods()只能访问类中声明为公有的方法,私有的方法它无法访问,能访问从其它类继承来的公有方法.getDeclaredFields()能访问类中所有的字段,与public,private,protect无关,不能访问从其它类继承来的方法 

* getConstructors()与getDeclaredConstructors()区别:getConstructors()只能访问类中声明为public的构造函数.getDeclaredConstructors()能访问类中所有的构造函数,与public,private,protect无关