java反射

来源:互联网 发布:在哪寻找淘宝客 编辑:程序博客网 时间:2024/05/29 03:17
package pack;import java.io.FileReader;import java.lang.reflect.Constructor;import java.lang.reflect.Method;import java.util.ArrayList;import java.util.Properties;class Person {    public int age;    public String name;    public Person() {}    private Person(int age) {        this.age = age;    }    public Person(int age, String name) {        this.age = age;        this.name = name;    }    public void show() {        System.out.println("show");    }    public void show2(int a) {        System.out.println(a);    }    public void method() {        System.out.println(this.age+"---"+this.name);    }    @Override    public String toString() {        return "Person [age=" + age + ", name=" + name + "]";    }}public class Main {    public static void main(String[] args) throws Exception {        //1.获取字节码文件对象        /*Person p = new Person();   //方法1        Class c1 = p.getClass();*/        //Class c = Person.class;     //方法2        /*try {                                                 Class c3 = Class.forName("pack.Person"); //方法3,最常用,它可以写成配置文件,下面代码不知是谁        } catch (ClassNotFoundException e) {            e.printStackTrace();        }*/        //2.获取构造函数对象    /*  Constructor[] cons = c.getConstructors();  //构造函数为public才能获取        for(Constructor con : cons)             System.out.println(con);*/        /*Constructor cons1 = c.getConstructor(); // 无参构造函数public        Object obj = cons1.newInstance();        System.out.println(obj);*/    /*  Constructor cons2 = c.getConstructor(int.class, String.class); //有参构造函数public        Object obj = cons2.newInstance(34, "bob");        System.out.println(obj);*/        /*Constructor cons3 = c.getDeclaredConstructor(int.class);   //私有构造函数        cons3.setAccessible(true); //使私有构造能访问        Object obj = cons3.newInstance(33);        System.out.println(obj);*/        //3.获取成员变量        //Filed f = c.getFields();        /*Field[] f1 = c.getDeclaredFields(); //获取所有成员变量        for(Field f : f1)            System.out.println(f);*/        /*Field f2 = c.getField("name");  //获取名为name的成员变量        Field f3 = c.getField("age");           f2.setAccessible(true);        f3.setAccessible(true);        Constructor cons4 = c.getConstructor();   //建个对象,下面赋值        Object obj = cons4.newInstance();        f2.set(obj, "alice");        f3.set(obj, 35);        System.out.println(obj);        */        //获取成员方法    /*  Method[] m1 = c.getMethods();  //获取自己和父类所有成员方法        for(Method method : m1)             System.out.println(method);        Method m2 = c.getMethod("show");  //第一个参数是方法名,第二个参数是方法参数        Constructor cons5 = c.getConstructor();        Object obj = cons5.newInstance();        m2.invoke(obj);    */        /*        Method m3 = c.getMethod("show2", int.class);  //第一个参数是方法名,第二个参数是方法参数        Constructor cons6 = c.getConstructor();        Object obj2 = cons6.newInstance();        m3.invoke(obj2, 4);   //调方法,有返回值就要接收*/      //----------------------------------配置方法------------------------------------------        //class.txt中:ClassName:pack.Person        //             MethodName:show        Properties p = new Properties();        FileReader fr = new FileReader("class.txt");        p.load(fr);        fr.close();        String classname = p.getProperty("ClassName");        String methodname = p.getProperty("MethodName");        Class c1 = Class.forName(classname);        Constructor cons = c1.getConstructor();        Object obj = cons.newInstance();        Method m = c1.getMethod(methodname);        m.invoke(obj);//----------------------------------------------------------------------------              //在ArrayList<Integer>对象中添加字符串数据        ArrayList<Integer> al = new ArrayList<Integer>();        Class c7 = al.getClass();        //Class c7 = ArrayList.class;        Method m3 = c7.getMethod("add", Object.class) ;        m3.invoke(al, "hello");        System.out.println(al);    }}
0 0
原创粉丝点击