最新消息:欢迎访问Android开发中文站!商务联系微信:loading_in

什么是反射?

Java基础 loading 491浏览 0评论

什么是反射?

Java 反射,就是在运行状态中。

  • 获取任意类的名称、package信息、所有属性、方法、注解、类型、类加载器等
  • 获取任意对象的属性,并且能改变对象的属性
  • 调用任意对象的方法
  • 判断任意一个对象所属的类
  • 实例化任意一个类的对象

Java 的动态就体现在这。通过反射我们可以实现动态装配,降低代码的耦合度;动态代理等。反射的过度使用会严重消耗系统资源。

JDK 中 java.lang.Class 类,就是为了实现反射提供的核心类之一。

获取 Class 的方法 、一个 jvm 中一种 Class 只会被实例化一次

package constxiong.interview;

/**
 * 测试 Class 类相关
 * @author ConstXiong
 * @date 2019-06-14 10:13:05
 */
public class TestClass {

    public static void main(String[] args) throws ClassNotFoundException {
        testGetClass();
    }

    /**
     * 测试获取 Class 对象,获取 Class 名称
     * @throws ClassNotFoundException
     */
    @SuppressWarnings("rawtypes")
    public static void testGetClass() throws ClassNotFoundException {
        TestClass t = new TestClass();
        Class class1 = t.getClass();
        System.out.println(class1.getName());

        Class class2 = TestClass.class;
        System.out.println(class2.getName());

        Class class3 = Class.forName("constxiong.interview.TestClass");
        System.out.println(class3.getName());

        //一个 jvm 中一种 Class 只会被实例化一次,对上面的 Class 实例进行判断发现都是相等的
        System.out.println(class1 == class2);
        System.out.println(class1 == class3);
    }

}

Class 类中方法测试

package constxiong.interview;

/**
 * 测试 Class 类相关
 * @author ConstXiong
 * @date 2019-06-14 10:13:05
 */
public class TestClass {

    private int i = 0;
    public int j = 1;

    private void t() {
        System.out.println("调用 TestClass 对象的 t() 方法");
    }

    public static void main(String[] args) throws ClassNotFoundException {
        testClassMethod();
    }

    /**
     * 测试 Class 对象的方法
     */
    public static void testClassMethod() {
        Class<TestClass> clazz = TestClass.class;
        System.out.println("clazz.getName() --> " + clazz.getName());//获取类全名(包含路径)
        System.out.println();
        System.out.println("clazz.getSimpleName() --> " + clazz.getSimpleName());//获取类简称
        System.out.println();
        System.out.println("clazz.getSuperclass() --> " + clazz.getSuperclass());//获取父类
        System.out.println();
        System.out.println("clazz.isInterface() --> " + clazz.isInterface());//判断是否为接口
        System.out.println();
        System.out.println("clazz.getFields() --> " + join(clazz.getFields(), "\r\n"));//获取 public 字段,包含父类 public 字段
        System.out.println();
        System.out.println("clazz.getDeclaredFields() --> " + join(clazz.getDeclaredFields(), "\r\n"));//获取所有字段
        System.out.println();
        System.out.println("clazz.getMethods() --> " + join(clazz.getMethods(), "\r\n"));//获取 public 方法,包含父类 public 方法
        System.out.println();
        System.out.println("clazz.getDeclaredMethods() --> " + join(clazz.getDeclaredMethods(), "\r\n"));//获取所有字段
        System.out.println();
        System.out.println("clazz.getConstructors() --> " + join(clazz.getConstructors(), "\r\n"));//获取构造方法
        System.out.println();
        try {
            clazz.newInstance().t();//实例化 TestClass 对象,调用对象中的 t() 方法
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }

    }

    /**
     * 拼接数组成字符串
     * @param objs
     * @param s
     * @return
     */
    private static String join(Object[] objs, String s) {
        StringBuilder r = new StringBuilder();
        for (Object obj : objs) {
            r.append(obj).append(s);
        }
        return r.toString();
    }
}

版权声明:本文为CSDN博主「ConstXiong」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/meism5/article/details/90413982

转载请注明:Android开发中文站 » 什么是反射?

您必须 登录 才能发表评论!