Java反射机制

来源:互联网 发布:nba2k17乔丹动作数据 编辑:程序博客网 时间:2024/05/01 22:49

Java的反射机制是在运行状态中,对于任意一个类,都可以知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性,这种动态获取的信息以及动态调用对象的方法的功能叫做Java的反射机制。射其实就是加载类,并获取类的各个组成部分。

加载类:

java中有一个Class类用于代表某一个类的字节码。获取class对象的方式有三种:① 调用Class类的forName(),② 通过  类名.class; ③ 对象.getClass();

反射类的组成部分的方法有:

① 获取public类型的各个组成部分:

getConstructor(Class...parameterTypes);

getMethod(String name,Class...parameterTypes);

getField(String name);

② 获取private类型的各个组成部分:

getDeclaredConstructor(Class...parameterTypes);

getDeclaredMethod(String name,Class...parameterTypes);

getDeclaredField(String name);

从类中获取各个组成部分是为了使用该类的各个部分。

使用反射机制,调用Person类中的构造函数,示例代码:

Person:

public class Person {public Person(){System.out.println("Person ");}public Person(String name){System.out.println("Person的姓名为:"+name);}public Person(String name,int age){System.out.println("Person的姓名为:"+name+",年龄为"+age);}private Person(int age){System.out.println("private age"+age);}}
Demo:

public class Demo {// 反射无参数的构造函数@Testpublic void test1() throws Exception {Class clazz = Class.forName("cn.itcast.reflect.Person");Constructor c = clazz.getConstructor(null);Person p = (Person) c.newInstance(null);}// 反射带一个参数的构造函数@Testpublic void test2() throws Exception {Class clazz = Class.forName("cn.itcast.reflect.Person");Constructor c = clazz.getConstructor(String.class);Person p = (Person) c.newInstance("zhangsan");}// 反射两个参数的构造函数@Testpublic void test3() throws Exception {Class clazz = Class.forName("cn.itcast.reflect.Person");Constructor c = clazz.getConstructor(String.class, int.class);Person p = (Person) c.newInstance("lisi", 20);}// 反射private的构造函数@Testpublic void test4() throws Exception {Class clazz = Class.forName("cn.itcast.reflect.Person");Constructor c = clazz.getDeclaredConstructor(int.class);// private修饰的只能在类内部调用,但是反射可以通过下面方式调用private修饰的。c.setAccessible(true);// 暴力反射Person p = (Person) c.newInstance(15);}// 反射无参数构造函数的另一种方式,等效于test1@Testpublic void test5() throws Exception {Class clazz = Class.forName("cn.itcast.reflect.Person");Person p = (Person) clazz.newInstance();// 该方法只能调用无参数的构造方法;}}
以上代码都是通过junit.Test来测试。运行结果如下:

Person 
Person的姓名为:zhangsan
Person的姓名为:lisi,年龄为20
private age15

Person 

利用反射机制中的Method执行方法是public Object invoke(Object object,Object... args),其中第一个参数为对象(当反射的是static类型的方法是,对象可以是null),第二个参数为方法所需要的参数。注意:在jdk 1.4时,没有可变参数,通过数组给参数列表传入参数,所以在反射main方法时,在传入参数列表时,① 把传入的数组类型强制转化成Object类型 ② 把传入的数组类型嵌套到Object数组中;




1 0
原创粉丝点击