Java反射机制

来源:互联网 发布:弱矩阵项目管理 编辑:程序博客网 时间:2024/05/05 19:50
反射是一种语言在运行时检查和动态调用类、方法、属性等的能力。反射就是通过class操作构造器,属性,方法等
import java.lang.annotation.Annotation;import java.lang.reflect.Constructor;import java.lang.reflect.Field;import java.lang.reflect.Method;import java.lang.reflect.Type;/** * 反射 * Created by wangbo on 11/28/16. */class Test{    public String name ;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public void say(String name){        System.out.println(name+"hello");    }    private void eat(String food){        System.out.println("eat"+food);    }    public Test() {    }    public Test(String name) {        this.name = name;    }}public class Reflect {    public static void main(String[] args) throws Exception {        /**         * 四种获取class的方式,可以指定泛型,也可以不指定,不声明泛型         */        //通过全限定名获得class        Class<?> clazz = Class.forName("Test");        //通过 类名. 获得class        Class<?> clazz1 = Test.class;        //通过 对象.getClass 获得class (多次一举)        Test test = new Test();        Class<?> clazz2 = test.getClass();        //通过类加载器获得class,(类加载器是负责加载类的对象)            //获取系统类加载器--->ClassLoader.getSystemClassLoader();            //获取当前类的类加载器--->Reflect.class.getClassLoader();            //获取当前线程的类加载器        ClassLoader classLoader = Thread.currentThread().getContextClassLoader();        Class clazz3 = classLoader.loadClass("java.util.Date");        /**         * 通过class获取类的构造器(constructor),方法(method,),属性(field,)         * declareds的方法不包括继承的          */        //获取全部方法(仅限于public)        Method[] methods = clazz.getMethods();        //获取指定方法,需要指定方法名字,和指定参数类型(没有参数就写null)        Method method = clazz.getMethod("say",String.class);        //获取所有访问权限的方法        clazz.getDeclaredMethods();        //获取所有权限的指定名称,参数类型的方法        clazz.getDeclaredMethod("eat",String.class);        //调用(invoke)获取到的方法,第一个参数添加指定的对象调用,第二个参数添加方法需要的参数         method.invoke(test,"wangbo");        //获取构造器和字段的方法大同小异,都有4个方法        //获取注解,获取该方法上的全部注解        Annotation[]annotations = method.getDeclaredAnnotations();        //获取语言修饰符,返回结果是int,常用的public=1,private=2具体可以去Modifier类里面看        int modifiers = method.getModifiers();        //获取包        Package pg = Test.class.getPackage();        //还有一些不太常用的方法可以自己去查Api比如 cast() 把对象转换成class 这个方法比较diao                /**         * 通过class创建一个实例,可以强转指定类型,也可以用object         */        //通过class自带的newInstance方法创建一个实例,这种方法必须保证类有一个默认的无参数构造器        Object obj = clazz.newInstance();        Test test1 = (Test) clazz.newInstance();        //通过class获取构造器,构造器指定参数.class,创建一个实例        Constructor<?> constructor = clazz.getDeclaredConstructor(String.class);        Object obj1 = constructor.newInstance("wangbo");        /**         * 通过class操作field的值         */        //获取字段        Field field = clazz.getField("name");        //设置字段属性值,第一个参数为指定对象,第二个参数为设定的新值        field.set(test,"zhangsan");        //获取字段的类型        Type type= field.getGenericType();        //获取field字段的名字        String fieldName = field.getName();            }}
如有错误,请多包含,互相进步:)

1 0
原创粉丝点击