反射机制个人笔记

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體:   |    |    |  超大  

一个类有多个组成部分,例如:成员变量,方法,构造方法等。

反射就是加载类,并解剖出类的各个组成部分

反射:加载类获得类的直接码(3种方法)

1.Class clazz =Class.forName("cn.itcast.reflect.person");

2.Class clazz1=new Person().getClass();

3.Class clazz2=person.class;

反射构造函数,创建类的对象

带String参数的构造函数

Class clazz =Class.forname("cn.itcast.reflect.person");//加载类

Constructor c=clazz.getConstructor(String.class); //创建构造函数

Person p=(person) c.newInstance("xxxx"); //创建实例并传参

带String int的构造函数函数

Class clazz =Class.forname("cn.itcast.reflect.person");//加载类

Constructor c=clazz.getConstructor(String.class,int.class); //创建构造函数

Person p=(person) c.newInstance("xxxx",12); //创建实例并传参

私有构造函数

Class clazz =Class.forname("cn.itcast.reflect.person");//加载类

Constructor c=clazz.getDeclareConstructor(List.class); //创建构造函数

c.setaccessible(ture);//暴力反射,可以反射私有构造函数,实现访问私有

Person p=(person) c.newInstance(new ArrayList()); //创建实例并传参

创建对象的另外一种途径

Class clazz =Class.forname("cn.itcast.reflect.person");//加载类

person p=(Person) clazz.newInstance();

不用反射构造函数,实际上他反射的是这个类的无参构造函数。想要这个方法正常

工作,意味着这个类里面必须要有一个无参构造函数

这个方法等效于

Class clazz =Class.forname("cn.itcast.reflect.person");//加载类

Constructor c=clazz.getConstructor(null); //创建构造函数

Person p=(person) c.newInstance(null); //创建实例并传参

反射类的方法

反射类的方法:public void aa1()

person p =new Person();

Class clazz=class.forName("cn.itcast.reflect.person");

Method method=clazz.getMethod("aa1",null);

method.invoke(p,null);

反射类的方法:public void aa1(string name,int passworld)

person p=new Person();

Class clazz=class.forName("cn.itcast.reflect.person");

Method method=clazz.getMethod("aa1",String.class,int.class);

method.invoke(p,"zxx",38);

反射类的方法:public class[] aa1(String name,int[] passworld)

person p=new Person();

Class clazz=class.forName("cn.itcast.reflect.person");

Method method=clazz.getMethod("aa1",String.class,int[].class);

Class cs[]=(Class[]) method.invoke(p,"aaa",new int[]{1,23});

反射类的方法:PRivate void aa1(InputStream in)

person p=new Person();

Class class="class".forname("cn.itcast.reflect.person");

Method method=clazz.getDeclaredMethod("aa1",InputStream.class);

method.setAccessible(true);

mrthod.invoke(p,new FileInputStream("c:\\1.txt"));

反射类的方法:public static void aa1(int num)

person p=new Person();

Class class="class".forname("cn.itcast.reflect.person");

Method method=class.getMethod("aa1",int.class);

method.invoke(null,23)

反射类的方法:public static void main(String[] args)

Class clazz=class.forname("cn.itcast.reflect.person");

Method method=class.getMethod("main",String[].class);

//method.invoke(null,(Object)new String[]("aa","bb"));

method.invoke(null,new Object[](new String[]("aa","bb")));

当反射的方法参数是数组时要注意,若直接写“method.invoke(null,new String[]("aa","bb"))”会报参数个数的错,

在jdk1.4中其会将其解析为a(String s1,String s2)将数组拆开作为参数。而其后高版本的jdk都兼容1.4版本。

这个问题是由jdk引起的。所以应该用以上的2种方法将参数是数组的方法的反射方式进行改写。

反射类的字段

反射字段:public String name="aaaa";

public void test1() throw Exception{

person p=new person();

Class clazz=Class.forName("cn.itcast.reflect.person");

Field f=clazz.getField("name");

Object obj=f.get(p);//获取字段的值

Class type=f.getType();//获取字段的类型

f.set(p,"xxxxx");设置字段的值

}

反射字段:private int name="aaaa";

public void test2() throw Exception{

person p=new person();

Class clazz=Class.forName("cn.itcast.reflect.person");

Field f=clazz.getDeclareField("passworld");

f.setAccessible(true);

//Object obj=f.get(p);//获取字段的值

//Class type=f.getType();//获取字段的类型

//f.set(p,"xxxxx");设置字段的值

system.out.println(f.get(p));

}

反射字段:private static int age=23;

public void test3() throw Exception{

person p=new person();

Class clazz=Class.forName("cn.itcast.reflect.person");

Field f=clazz.getDeclareField("age");

f.setAccessible(true);

//Object obj=f.get(p);//获取字段的值

//Class type=f.getType();//获取字段的类型

//f.set(p,"xxxxx");设置字段的值

system.out.println(f.get(p));

}

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航