zoukankan      html  css  js  c++  java
  • 反射机制个人笔记

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

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

  • 相关阅读:
    51nod-1420-贪心
    51nod-1455-dp/缩小范围
    51nod-1574-排列转换
    简单的鼠标滚轮事件
    数组去重
    模仿jq里的选择器和color样式
    在页面里写个动态本地时间
    使用css中的flex布局弹性手风琴效果
    bootstrap中如何多次使用一个摸态框
    使用css让文字两端对齐
  • 原文地址:https://www.cnblogs.com/ChrisMurphy/p/4810092.html
Copyright © 2011-2022 走看看