Java反射02--Filed,Method,Constructor类

Java反射02–Filed,Method,Constructor类

一Filed类常用方法

上一篇已经说过了Field对象的创建,下面回顾下,同时介绍下Filed类的常用方法。
测试类如下:

public  class Car {
    //四种不同权限修饰符的属性
    public  String publicProperty="publicProperty";
    protected   String protectedProperty="protectedProperty";
    String defaultProperty="defaultProperty";
    private   String privateProperty="privateProperty";
    //四种不同权限修饰符的方法
    public  void showPublicMethod(String record){
        System.out.println("This is a Public Method"+record);
    }
    protected   void showProtectedMethod(String record){
        System.out.println("This is a Protected Method"+record);
    }
    void showDefaultMethod(String record){
        System.out.println("This is a Default Method"+record);
    }
    private   void showPrivateMethod(String record){
        System.out.println("This is a Private Method"+record);
    }

    public  Car(){
    }
    protected  Car(String record){
    	this.publicProperty=record;
    }
    Car(Integer record){
    }
    private Car(String record1,Integer record2){
    }
}

通过Car类的Class对象获取Car类中属性对应的Field对象

Class<Car> carClass = (Class<Car>) Class.forName("cn.yy.testClassObject.Car");
//获取car类中所有权限修饰符为public的属性对应的Field对象
Field[] fields = carClass.getFields();
//获取car类中所有权限修饰符的属性对应的Field对象
Field[] declaredFields = carClass.getDeclaredFields();
//获取car类中指定名称的属性对应的Field对象
Field field01 = carClass.getDeclaredField("protectedProperty");

Field类常用方法

1 getName()方法获取属性名
2 get()方法,获取属性值,参数为实例化的Car对象

3 set()方法 设置属性值
4 getType() 获取属性的声明类型

//获取car类中指定名称的属性对应的Field对象
Field field01 = carClass.getDeclaredField("protectedProperty");
//设置暴力反射,否则权限不够,只能获取public的属性
field01.setAccessible(true);
//getName()方法获取属性名
String fieldName = field01.getName();
System.out.println("属性名为:"+fieldName);
//get()方法,获取属性值,参数为实例化的Car对象
Car car01 = new Car();
String str = (String) field01.get(car01);
System.out.println("car01的protectedProperty值为:"+str);
//set方法修改Car类的实例对象中属性protectedProperty的值
field01.set(car01,"修改后的protectedProperty属性值");
System.out.println("car01的protectedProperty值为:"+field01.get(car01));
//获取属性的声明类型
Class<?> type = field01.getType();
System.out.println(type);
属性名为:protectedProperty
car01的protectedProperty值为:protectedProperty
car01的protectedProperty值为:修改后的protectedProperty属性值
class java.lang.String

注意若获取或修改非public的属性值,需要设置暴力反射

否则会报错

Exception in thread "main" java.lang.IllegalAccessException: Class cn.yy.Reflection01_Class can not access a member of class cn.yy.testClassObject.Car with modifiers "protected"
	at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:102)
	at java.lang.reflect.AccessibleObject.slowCheckMemberAccess(AccessibleObject.java:296)
	at java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:288)
	at java.lang.reflect.Field.get(Field.java:390)
	at cn.yy.Reflection01_Class.testField(Reflection01_Class.java:42)
	at cn.yy.Reflection01_Class.main(Reflection01_Class.java:30)

二 Method类常用方法

获取Method对象
在这里插入图片描述

Class<Car> carClass = (Class<Car>) Class.forName("cn.yy.testClassObject.Car");
//根据方法名获取Method对象
Method showDefaultMethod = carClass.getMethod("showPublicMethod");
//获取car类中所有public的方法对应的Method对象
Method[] methods = carClass.getMethods();
//获取car获取car类中所有方法对应的Method对象
Method[] declaredMethods = carClass.getDeclaredMethods();

可以看到,getMethods(),方法除了获取car类本身的public方法,还获取了继承自Object类的方法。
在这里插入图片描述
Method类常用方法

Class<Car> carClass = (Class<Car>) Class.forName("cn.yy.testClassObject.Car");
Method showDefaultMethod = carClass.getDeclaredMethod("showDefaultMethod",String.class);
//当Method对象非public时,需要暴力破解才能执行
showDefaultMethod.setAccessible(true);
Car car01 = new Car();
String message="传入的参数";
//通过invoke方法执行car01中对应的方法
showDefaultMethod.invoke(car01,message);
//getName()获取方法名
System.out.println(showDefaultMethod.getName());
//获取参数类型
Class<?>[] parameterTypes = showDefaultMethod.getParameterTypes();
for (Class clazz:parameterTypes) {
    System.out.println(clazz);
}

注意若获取非public的方法需要使用getDeclaredMethod。
否则报错:找不到方法

Exception in thread "main" java.lang.NoSuchMethodException: cn.yy.testClassObject.Car.showDefaultMethod(java.lang.String)

三 Constructor类常用方法

获取Constructor对象
在这里插入图片描述

Class<Car> carClass = (Class<Car>) Class.forName("cn.yy.testClassObject.Car");
Class<?> aClass = Class.forName("cn.yy.testClassObject.SUVCar");
Constructor<?>[] constructors = carClass.getConstructors();
Constructor<?>[] declaredConstructors = carClass.getDeclaredConstructors();
//因为构造函数时重载的,名称一样,因此通过参数类型 来获取指定的Constructor对象
Constructor<Car> stringParameterConstructor = carClass.getDeclaredConstructor(String.class);

在这里插入图片描述
Constructor对象常用方法

 //因为构造函数时重载的,名称一样,因此通过参数类型 来获取指定的Constructor对象
Constructor<Car> stringParameterConstructor = carClass.getDeclaredConstructor(String.class);
stringParameterConstructor.setAccessible(true);
//通过newInstance方法创建Car类的实例对象
Car car02 = stringParameterConstructor.newInstance("传入构造函数的参数");
System.out.println(car02.publicProperty);
传入构造函数的参数
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值