JAVA反射基础

Class获取

  • Object.getClass()

        Student s = new Student();
        Class clazz = s.getClass();
  • .class标识
 Class clazz = Student.class;
  • Class.forName()
        try {
            Class clazz = Class.forName("包名+.Student");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

getName()、getSimpleName()和getCanonicalName()

https://blog.csdn.net/qq_40667603/article/details/105551541

Class 获取修饰符

 通过Class.getModifiers()获取到一个int值,然后用Modifier类去解析

    Class clazz = Class.forName("com.zrsoft.green.Student");
    System.out.println(Modifier.toString(clz1.getModifiers()));
    System.out.println(Modifier.isPublic(clazz.getModifiers()));
    System.out.println(Modifier.isPrivate(clazz.getModifiers()));

返回

   

获取Class成员

获取Filed

  • getDeclaredFields() : 可以获取到被private修饰的属性,不会获取祖先类属性
  • getFields()  :  不能获取被private修饰的属性,会获取祖先类属性
  • getDeclaredField(String name)  :  获取指定名字属性 可以获取到被private修饰的属性,不会获取祖先类属性
  • getField(String name)  :   获取指定名字属性 不能获取被private修饰的属性,会获取祖先类属性

示例

public class Person {
    public String high;
    private String weight;
}

public class Student extends Person{
    private String name;
    public String age;
}




     Class clazz = Class.forName("com.zrsoft.green.Student");

            Field[] field1s = clazz.getDeclaredFields();
            for (Field field1 : field1s) {
                System.out.println(field1.getName());
            }
            System.out.println("--------------");
            Field[] field2s = clazz.getFields();
            for (Field field2 : field2s) {
                System.out.println(field2.getName());
            }

输出

    

获取Method

  • getDeclaredMethod(String name, Class<?>... parameterTypes)
  • getMethod(String name, Class<?>... parameterTypes)
  • getDeclaredMethods() throws SecurityException
  • getMethods() 

parameterType是方法的参数,和获取属性方法类似,有参数时必须传入参数的Class

public void studyPulic(String name) {

    }



Method m = clazz.getMethod("studyPulic",String.class);

获取 Constructor

  •  getDeclaredConstructor(Class<?>... parameterTypes)
  • getConstructor(Class<?>... parameterTypes)  Constructor 不能从父类继承,没有办法通过 getConstructor() 获取到父类的 Constructor
  • getDeclaredConstructors() 
  • getConstructors()  Constructor 不能从父类继承没有办法通过 getConstructor() 获取到父类的 Constructor

Field 处理

Field 获取属性名

  • getName()方法

Field 类型的获取

  • getGenericType() 能获取到泛型类型
  • getType()  
  • getComponentType() 如果属性是数组,可通过此方法获取数组中参数类型

Field 修饰符的获取

  • getModifiers() 和获取Class的修饰符一样

Field 值的读取和赋值

  • 读取  :  Field中一系列的get方法,如get(Object obj) 、getInt(Object object)、getBoolean(Object object)等
  • 赋值  :   Field中一系列的set方法,如set(Object obj,,Object value) 、setInt(Object object,int value)、setBoolean(Object object,boolean value)等

Object 代表想要获取或者赋值的对象,注意属性被private修饰时需要在进行操作前调用Field对象的setAccessible(true),打开操作权限

Method  处理

Method  获取方法名

  • getName()方法

Method  获取修饰符

  • getModifiers() 获取参数的修饰符 同上Class处理

Method 获取方法参数相关

  • getParameters() 返回的是一个Parameter数组
  • getParameterTypes()  获取所有的参数类型 返回Class数组
  • getGenericParameterTypes() 获取所有的参数类型,包括泛型 返回Type数组

Parameter中的方法(获取方法参数相关)

  • getName() 获取参数名字 如果jdk是1.8以下或者没有设置带参数名编译,那么Parameter的getName函数只会返回arg0,arg1,arg2......
  • getType()  获取参数类型
  • getModifiers() 获取参数的修饰符 同上Class处理

Method 获取方法返回值类型

  • getReturnType() 返回Class数组
  • getGenericReturnType() 包括泛型 返回Type数组

Method 获取异常类型

  • getExceptionTypes() 类比上方
  • getGenericExceptionTypes() 类比上方

Method 方法的执行

  • invoke(Object obj, Object... args) 返回Object对象,有返回值时需要强转

  注意  :  第一个Object代表具体某个对象,和Filed赋值和取值传入的类似,静态方法传null,剩下的Object对应方法参数。方法抛出异常时可在InvocationTargetException 中获取。在执行private修饰的方法时需先调用Method对象的setAccessible(true)方法打开操权限,

示例

 public void test(String name) throws IllegalAccessException {
        throw new IllegalAccessException("抛出异常" + name);
    }



 try {
            Student student = new Student();
            Class clazz = student.getClass();
            Method m = clazz.getMethod("test", String.class);
            System.out.println("方法名称:" + m.getName());
            Type[] p = m.getGenericParameterTypes();
            System.out.println("参数数量:" + p.length);
            for (Type parameter : p) {
                System.out.println("参数名称:" + parameter.getTypeName());
            }
            m.invoke(student,"李三");

        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
            System.out.println("方法传出异常:" + e.getCause().getMessage());
        }

打印

Constructor 处理

在 Java 反射机制中有两种方法可以用来创建类的对象实例:Class.newInstance() 和 Constructor.newInstance()。官方文档建议开发者使用后面这种方法,下面是原因。

  • Class.newInstance() 只能调用无参的构造方法,而 Constructor.newInstance() 则可以调用任意的构造方法。
  • Class.newInstance() 通过构造方法直接抛出异常,而 Constructor.newInstance() 会把抛出来的异常包装到 InvocationTargetException 里面去,这个和 Method 行为一致。
  • Class.newInstance() 要求构造方法能够被访问,而 Constructor.newInstance() 却能够访问 private 修饰的构造器。访问时需要调用Constructor对象的setAccessible(true)打开权限

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值