反射机制个人笔记
一个类有多个组成部分,例如:成员变量,方法,构造方法等。
反射就是加载类,并解剖出类的各个组成部分
反射:加载类获得类的直接码(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));
}