反射机制个人笔记

一个类有多个组成部分,例如:成员变量,方法,构造方法等。
反射就是加载类,并解剖出类的各个组成部分

反射:加载类获得类的直接码(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));
        }

posted @ 2015-09-15 13:51  ChrisMurphy  阅读(279)  评论(0编辑  收藏  举报