反射

1 什么是反射

反射就是将java类中的所有东西映射成一个个java对象,在运行状态下,对于任意一个类,都能知道这个类中的所有属性和方法,,对于任意一个对象,都能调用它的任意一个方法和属性,这种动态获取信息以及动态嗲用方法的功能是java反射机制。

2 三种方式

  • 类名.class
  • 对象.getClass()
  • 通过全类名 Class.forName("全类名")

3 例子

public static void main(String[] args) {
        //类名获取
        Class cla = TXtFlyzAjjbxx.class;
        Field[] declaredFields = cla.getDeclaredFields();
        System.out.println(123);
        //对象获取
        TXtFlyzAjjbxx tXtFlyzAjjbxx = new TXtFlyzAjjbxx();
        Class aClass = tXtFlyzAjjbxx.getClass();
        Method[] method = aClass.getMethods();
        //全类名
        try {
            Class<?> aClass1 = Class.forName("com.hzc.xtzj.model.flyz.TXtFlyzAjjbxx");
            Field[] declaredFields1 = aClass1.getDeclaredFields();
            ;
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        //字符串的例子
        Class clazz = null;
        clazz = String.class;

        clazz = "javaTest".getClass();

        try {
            clazz = Class.forName("java.lang.String");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        System.out.println();


    }

newInstance()方法

Class<? extends TXtAjGyNode> cla1 = TXtFlyzAjjbxx.class;
        TXtAjGyNode o = cla1.newInstance();
        Field[] declaredFields1 = cla1.getDeclaredFields();

类加载器 classloader

 //系统类加载器
        ClassLoader cla = ClassLoader.getSystemClassLoader();
        System.out.println(cla);

        //系统的父类加载器(扩展加载器)
        System.out.println(cla.getParent());

        //扩展加载器的父类加载器(不可获取)
        System.out.println(cla.getParent().getParent());

        //当前类 属于系统加载器加载
        Class<XtzjApplicationTests> xtzjApplicationTestsClass = XtzjApplicationTests.class;
        System.out.println(xtzjApplicationTestsClass.getClassLoader());

        //Object  属于哪个加载器 引导类 看不到
        Class<Object> objectClass = Object.class;
        System.out.println(objectClass.getClassLoader());

Class 是一个描述类的类 封装了描述方法的 method 描述字段的filed 描述构造器的constructor

反射调用方法注意

在使用invoke调用方法时 若是私有方法

 //私有方法的执行,必须在调用invoke之前加上一句method.setAccessible(true);

注解 @interface

public class test {

    @wodezhujie
    public void test() {
        System.out.println("testzhxingh");
    }

    public void test2() {
        System.out.println("test2222zhxingh");
    }

    public static void main(String[] args) {
        Class<test> testClass = test.class;
        Method[] methods = testClass.getMethods();
        for (Method m : methods) {
            boolean annotationPresent = m.isAnnotationPresent(wodezhujie.class);
            if (annotationPresent){
                try {
                    m.invoke(testClass.newInstance(),null);
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                } catch (InvocationTargetException e) {
                    e.printStackTrace();
                } catch (InstantiationException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容