java反射-学习

时间:2019-06-12
本文章向大家介绍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);
        }

原文地址:https://www.cnblogs.com/nxzblogs/p/10938182.html