Java之反射代码演示说明

来源:互联网 发布:如何淘宝买东西 编辑:程序博客网 时间:2024/06/02 03:34

还不存在的类–即我们需要使用反射来使用的类

Person类:

package com.qf.demo4;public class Person {    private String name;    public int age;    static int weight;    int male;    protected int num;    public Person(String name, int age, int weight) {        this.name = name;        this.age = age;        this.weight = weight;        System.out.println("有参数的构造方法");    }    public Person() {        System.out.println("无参数的构造方法");    }    public void eat() {        System.out.println("吃");    }    public void drink(String type) {        System.out.println("喝" + type);    }    public String sleep() {        System.out.println("睡");        return "呵呵";    }    private void play() {        System.out.println("玩");    }    public static void hehe() {        System.out.println("heheheheh");    }    @Override    public String toString() {        return "Person [name=" + name + ", age=" + age + ",weight = "+weight+"]";    }}

演示代码:


Test1:创建Class对象

package com.qf.demo4;import com.qf.demo.Person;/** * 每一个类只有一个class 对象 * com.qf.demo.Person 包名+类名  全限定名 * @author Administrator * */public class Test {    public static void main(String[] args) {        // 创建Class 对象        // 第一种方式:类.class        Class class1 = Person.class;        System.out.println(class1.hashCode());        // 第二种方式:创建类的对象;然后--对象.getClass()        Person person = new Person();        Class class2 = person.getClass();        System.out.println(class2.hashCode());        // 第三种方式:使用forname方法,参数为相对于本工程的地址        try {            Class class3 = Class.forName("com.qf.demo.Person");            System.out.println(class3.hashCode());        } catch (ClassNotFoundException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }    }}

Test2:创建Constructor对象,并创建Person类(还没有的类)对象

package com.qf.demo4;import java.lang.reflect.Constructor;import java.lang.reflect.InvocationTargetException;public class Test2 {    public static void main(String[] args) {        try {            Class class1 = Class.forName("com.qf.demo4.Person");            Constructor[] constructors = class1.getConstructors();            for (Constructor constructor : constructors) {                System.out.println(constructor);            }            // 1 通过构造方法创建  Perosn对象            Constructor constructor = class1.getConstructor(null);// 得到无参的构造方法            Person person = (Person) constructor.newInstance(null);            System.out.println(person);            // 2 利用有参数的构造方法创建对象            Constructor constructor2 = class1.getConstructor(String.class,int.class,int.class);            Person person2 = (Person) constructor2.newInstance("张三",5,9);            System.out.println(person2);        } catch (ClassNotFoundException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } catch (NoSuchMethodException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } catch (SecurityException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } catch (InstantiationException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } catch (IllegalAccessException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } catch (IllegalArgumentException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } catch (InvocationTargetException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }    }}

Test3:获取方法,以及调用方法

package com.qf.demo4;import java.lang.reflect.Constructor;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;public class Test3 {    public static void main(String[] args) {        try {            Class class1 = Class.forName("com.qf.demo4.Person");            // 得到构造方法            Constructor constructor = class1.getConstructor(null);            Object object = constructor.newInstance(null);            Method[] methods = class1.getMethods();// 得到本类和父类的非私有的方法            Method[] methods2 = class1.getDeclaredMethods();// 得到本类中声明的所有的方法(包括私有)            // 得到 无参  无返回值的 方法并且调用            Method method = class1.getMethod("eat", null);            //            调用方法的对象    实际参数            method.invoke(object, null);// 是哪个方法被调用            // 调用  有参数 无返回值的方法            Method method2 = class1.getMethod("drink", String.class);            method2.invoke(object, "水");            // 有返回值的            Method method3 = class1.getMethod("sleep", null);            Object  object2 = method3.invoke(object, null);// invoke方法的返回值就是调用的方法的返回值            System.out.println(object2);            // 得到静态的方法            Method method4 = class1.getMethod("hehe", null);            method4.invoke(null, null);// 静态方法不需要传递对象  直接写null            // 私有的   私有的方法 必须用 getDeclaredMethod 才能得到            Method method5 = class1.getDeclaredMethod("play", null);            method5.setAccessible(true);// 私有方法默认没有权限调用,必须单独设定调用权限            method5.invoke(object, null);        } catch (ClassNotFoundException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } catch (NoSuchMethodException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } catch (SecurityException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } catch (InstantiationException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } catch (IllegalAccessException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } catch (IllegalArgumentException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } catch (InvocationTargetException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }    }}

反射定义:http://blog.csdn.net/baidu_37107022/article/details/71234940

0 0