前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java反射机制

Java反射机制

作者头像
提莫队长
发布2019-02-21 11:18:33
3850
发布2019-02-21 11:18:33
举报
文章被收录于专栏:刘晓杰刘晓杰

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类; 在运行时构造任意一个类的对象; 在运行时判断任意一个类所具有的成员变量和方法; 在运行时调用任意一个对象的方法; 生成动态代理。

在JDK中,主要由以下类来实现Java反射机制,这些类都位于java.lang.reflect包中:

代码语言:javascript
复制
Class类:代表一个类。
Field 类:代表类的成员变量(成员变量也称为类的属性)。
Method类:代表类的方法。
Constructor 类:代表类的构造方法。
Array类:提供了动态创建数组,以及访问数组的元素的静态方法。

接下来我会给个例子展示

代码语言:javascript
复制
public class ReflectTest {
    public static void main(String[] args) throws Exception {
        // 获取类
        Class<Demo> c = Demo.class;
        Object o = c.newInstance();

        // 获取成员变量,get,set必须是同一个object,否则输出默认的11
        Field idF = c.getDeclaredField("id");
        idF.setAccessible(true);
        idF.set(o, "110");
        System.out.println(idF.get(o));

        // 获取无参函数,invoke参数为o是表示同一个实例,输出之前存储的110,如果是c.newInstance()输出默认的11
        Method method = c.getDeclaredMethod("printId");
        method.setAccessible(true);
        method.invoke(o);

        // 获取有参函数
        Method method1 = c.getDeclaredMethod("print", String.class);
        method1.setAccessible(true);
        method1.invoke(o, "hello");

        Class<?>[] class1 = c.getDeclaredClasses();
        for (Class<?> cls : class1) {
            if (cls.getName().contains("Inner")) {
                // 构造成员内部类实例
                Constructor<?> con2 = cls.getDeclaredConstructor(c);
                con2.setAccessible(true);
                Inner inner = (Inner) con2.newInstance(o);
                inner.run();
            } else if (cls.getName().contains("StaticInstance")) {
                // 构造静态内部类实例
                StaticInstance instance = (StaticInstance) cls.newInstance();
                instance.run();
            }
        }

        // 获取匿名内部类实例(要求:已经生成对应的实例,也就是已经new过了)
        Field field = c.getDeclaredField("inner2");
        field.setAccessible(true);
        Inner r = (Inner) field.get(o);
        r.run();
    }
}

class Demo {
    private String id = "11";

    private void printId() {
        System.out.println(id);
    }

    private void print(String content) {
        System.out.println(content);
    }

    private Inner inner;

    private Inner inner2 = new Inner();

    class Inner {
        public void run() {
            System.out.println("inner-running");
        }
    }

    private StaticInstance staticInstance;

    static class StaticInstance {
        public void run() {
            System.out.println("staticInstance-running");
        }
    }
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016年10月17日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档