• 技术文章 >Java >java教程

    Java反射获取类和对象信息的详细介绍

    黄舟黄舟2017-03-28 10:51:53原创822
    反射可以解决在编译时无法预知对象和类是属于那个类的,要根据程序运行时的信息才能知道该对象和类的信息的问题。

    在两个人协作开发时,你只要知道对方的类名就可以进行初步的开发了。

    获取类对象

    具体使用还是要根据实际来选择,第一种方式是比较自由的,只要知道一个类名就可以了,其不会做该类是否存在的校验,第二种、第三种则会做校验

    获取类的信息

    获取类构造器

    获取类成员方法

    获取类成员变量

    获取类注解

    获取该类内部类

    获取该类对象所在的外部类

    获取该类对象对应类所实现的接口

    获取该类对象对应类所继承的父类

    获取该类对象对应类的修饰符、所在包、类名等基本信息

    判断该类是否为接口、枚举、注解类型

    public interface Colorable {
         public void value();
    }
    public class ClassInfo {
    
        public static void main(String[] args) throws NoSuchMethodException, SecurityException {
            Class<Colorable> cls=Colorable.class;
            System.out.println(cls.getMethod("value"));
            System.out.println(cls.isAnnotation());
            System.out.println(cls.isInterface());
        }
    
    }

    结果

    public abstract void com.em.Colorable.value()
    false
    true

    Java8中新增的方法参数反射

    public class Test {
        public void getInfo(String str,List<String>list){
            System.out.println("成功");
        }
    }
    public class ClassInfo {
    
        public static void main(String[] args) throws NoSuchMethodException, SecurityException {
            Class<Test> cls=Test.class;
            Method med=cls.getMethod("getInfo", String.class,List.class);
            System.out.println(med.getParameterCount());
            Parameter[] params=med.getParameters();
            System.out.println(params.length);
            for(Parameter par:params){
                System.out.println(par.getName());
                System.out.println(par.getType());
                System.out.println(par.getParameterizedType());
            }
        }
    
    }

    结果

    2
    2
    arg0
    class java.lang.String
    class java.lang.String
    arg1
    interface java.util.List
    java.util.List<java.lang.String>

    反射生成对象

    反射调用方法

    public class Test {
    
        public Test(String str) {
            System.out.println(str);
        }
        public void getInfo(String str){
            System.out.println(str);
        }
    }
    public class ClassInfo {
    
        public static void main(String[] args) throws Exception {
            Class<Test> cls=Test.class;
            Constructor<Test>construct=cls.getConstructor(String.class);
            Test test=construct.newInstance("初始化");
            Method med=cls.getMethod("getInfo", String.class);
            med.invoke(test, "调用方法成功");
        }
    
    }

    结果

    初始化
    调用方法成功

    接下来看官仔细看下面的栗子

    public class Test {
    
        public Test(String str) {
            System.out.println(str);
        }
        //私有方法
        private void getInfo(String str){
            System.out.println(str);
        }
    }
    public class ClassInfo {
    
        public static void main(String[] args) throws Exception {
            Class<Test> cls=Test.class;
            Constructor<Test>construct=cls.getConstructor(String.class);
            Test test=construct.newInstance("初始化");
          //为啥使用这个方法呢?
            Method med=cls.getDeclaredMethod("getInfo", String.class);
          //为啥使用这个方法呢?
            med.setAccessible(true);
            med.invoke(test, "调用方法成功");
        }
    
    }

    结果

    初始化
    调用方法成功

    setAccessible(boolean flag):将值设为true,指示该Method在使用是应该取消Java语言的访问权限检查

    访问成员变量值

    以上两个方法可以方法所有的成员变量,包括private的私有成员变量

    public class Test {
        private int num;
    
        public Test(String str) {
            System.out.println(str);
        }
        private void getInfo(String str){
            System.out.println(str);
        }
        public int getNum() {
            return num;
        }
        public void setNum(int num) {
            this.num = num;
        }
    
    }
    public class ClassInfo {
    
        public static void main(String[] args) throws Exception {
            Class<Test> cls=Test.class;
            Constructor<Test>construct=cls.getConstructor(String.class);
            Test test=construct.newInstance("初始化");
            Method med=cls.getDeclaredMethod("getInfo", String.class);
            med.setAccessible(true);
            med.invoke(test, "调用方法成功");
            Field fld=cls.getDeclaredField("num");
            fld.setAccessible(true);
            fld.setInt(test, 12);
            System.out.println(fld.getInt(test));
        }
    
    }

    结果

    初始化
    调用方法成功
    12

    操作数组

    java.lang.reflect包下有一个Array类,其可以动态创建数组

    static Object newInstance(Class<?>componentType,int...length):创建一个具有指定的元素类型、指定维度的新数组

    static xxx getXxx(Object array,int index):返回array数组中第index个元素。其中xxx是各种基本数据类型,如果数组元素是引用类型,则该方法变为get()

    static void setXxx(Object array,int index,xxx val):将array数组中低index 个元素的值设为val,其中xxx是各种基本数据类型,如果数组元素是引用类型,则该方法变为set()

    public class ArrayInfo {
    
        public static void main(String[] args) {
            Object arrays=Array.newInstance(String.class, 3);
            Array.set(arrays, 0, "第一个");
            Array.set(arrays, 1, "第二个");
            Array.set(arrays, 2, "第三个");
            System.out.println(Array.get(arrays, 2));
        }
    }

    以上就是Java反射获取类和对象信息的详细介绍的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:Java,反射,
    上一篇:Java实现hashCode方法的示例代码分享 下一篇:详解Java集合框架ArrayList源码剖析(图)
    VIP课程(WEB全栈开发)

    相关文章推荐

    • 【腾讯云】年中优惠,「专享618元」优惠券!• 一起来聊聊与Java中性能相关的设计模式• Java图文详解之实现图书管理系统• JAVA外观模式详解• 详细整理java枚举的使用总结• 带你搞懂JAVA反射机制(总结分享)
    1/1

    PHP中文网