zoukankan      html  css  js  c++  java
  • java反射-学习

    使用Java反射机制可以在运行时期获取Java类的信息,可获取以下相关的内容:
    Class对象
    类名
    修饰符
    包信息
    父类
    实现的接口
    构造器
    方法
    变量
    注解

    简单的反射例子:

    1、获取class对象(前提):

     Class<Test> testClass = Test.class;
    或
    Class<?> aClass = Class.forName("com.alibaba.fastjson.JSONObject");

    2、获取类名:

    String name1 = testClass.getName();
    System.out.println("类名:"+name1);

    结果:

    类名:com.example.demo.Test

    3、修饰符

                Class<Test> testClass = Test.class;
            //当前类的修饰符
            int modifiers = testClass.getModifiers();
            System.out.println(Modifier.isAbstract(modifiers));
            System.out.println(Modifier.isPublic(modifiers));
            System.out.println(Modifier.isPrivate(modifiers));
    
        //结果
    
    false
    true
    false

    方法的修饰符

            Class<Test> testClass = Test.class;
            Method method = testClass.getMethod("getName", new Class[]{});
            int modifiers1 = method.getModifiers();
            System.out.println(Modifier.isPrivate(modifiers1));
            System.out.println(Modifier.isPublic(modifiers1));
    
    //结果
    false
    true

    4、包信息

            Class<Test> testClass = Test.class;
            Package aPackage = testClass.getPackage();
            System.out.println(aPackage);
    
            //结果
            package com.example.demo

    5、父类

            Class<Test> testClass = Test.class;
            Class<? super Test> superclass = testClass.getSuperclass();
            String name = superclass.getName();
            System.out.println(name);
    
            //结果
            java.lang.Object

    6、实现的接口

            Class<Test> testClass = Test.class;
            Class<?>[] interfaces = testClass.getInterfaces();
            for (Class<?> anInterface : interfaces) {
                System.out.println(anInterface.getName());
            }
    
            //test类没有实现接口 ,interfaces为空数组

    7、构造器(获取public共有修饰符的构造方法)

            Class<Test> testClass = Test.class;
            Constructor<?>[] constructors = testClass.getConstructors();
            for (Constructor<?> constructor : constructors) {
                System.out.println(constructor.getName());
            }    
    
            //结果
    
            com.example.demo.Test

      

      例子:

      

            Class<Test> testClass = Test.class;
            Constructor<Test> constructor = testClass.getConstructor();
            Test test = constructor.newInstance();
            System.out.println(test.delete());
    
    //结果
    delete

    8、获取变量和方法

    package com.example.demo;
    
    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    
    public class Test {
        public static void main(String[] args) {
    
            //获取属性
            Field[] fields = Test.class.getDeclaredFields();
            for (Field field : fields) {
                System.out.println(field.getName());
            }
    
            System.out.println("属性==================方法");
            Method[] methods = Test.class.getMethods();
            for (Method method : methods) {
                String name = method.getName();
                System.out.println(name);
            }
        }
    
        private String name;
        private String sex;
    
        public String delete() {
            return "delete";
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getSex() {
            return sex;
        }
    
        public void setSex(String sex) {
            this.sex = sex;
        }
    }

    输出结果:

    name
    sex
    前边为属性==================后边为当前类的所有的方法方法(保存从父类那继承来的方法)
    main
    getName
    delete
    setName
    getSex
    setSex
    wait
    wait
    wait
    equals
    toString
    hashCode
    getClass
    notify
    notifyAll

    例子:

            Class<Test> testClass = Test.class;
            //获取的方法是没有参数的,所以下边这个第二个参数就可以设置为null
            Method getName = testClass.getMethod("getName", null);
            //set方法只有一个参数,下班这个方法的第二个参数就是string.class
            Method setName = testClass.getMethod("setName", String.class);
            //假如一个方法有两个参数,则需要如下设置第二个参数
            Method setSex = testClass.getMethod("setSex", new Class[]{String.class, String.class});

    获取一个方法的参数类型:

            Class<Test> testClass = Test.class;
            Method method = testClass.getMethod("getName", null);
            Class<?>[] parameterTypes = method.getParameterTypes();
            for (Class<?> parameterType : parameterTypes) {
                System.out.println(parameterType.getName());
            }

    后去一个方法的返回类型:

            Class<Test> testClass = Test.class;
            Method method = testClass.getMethod("getName", null);
            Class<?> returnType = method.getReturnType();
            System.out.println(returnType.getName());
    
    //结果 getname方法的返回值的类型为string
    java.lang.String

    通过method调用方法:如果执行的是静态方法,的method.invoke方法的第一个参数可以设置为null,第二个参数为方法执行需要的实参

            Test t = new Test();
            t.setName("aaaaa");
            Class<? extends Test> testClass = t.getClass();
            Method method = testClass.getMethod("getName",null);
            String invoke = (String)method.invoke(t,null);
            System.out.println(invoke);

    ****Method.setAcessible(true)这行代码,通过调用setAccessible()方法会关闭指定类的Method实例的反射访问检查

     9、注解

            Class<Test> testClass = Test.class;
            Annotation[] annotations = testClass.getAnnotations();
            for (Annotation annotation : annotations) {
                System.out.println(annotation);
            }
  • 相关阅读:
    python 获取在线视频时长,不下载视频
    python treeview 多线程下表格插入速度慢解决方法
    c#操作magick,magick.net
    油猴脚本-Tampermonkey-淘宝dsr过滤器(过滤非3红商品)
    python 基础小坑 0==False is True
    pyd 编译,简单命令cythonize
    python 调用Tesseract,dll模式,无需安装,绿色版
    list与set的查询效率,大量数据查询匹配,必须选set
    selenium 页面加载慢,超时的解决方案
    selenium 不打印chromedriver的日志信息
  • 原文地址:https://www.cnblogs.com/nxzblogs/p/10938182.html
Copyright © 2011-2022 走看看