反射学习笔记

一.Class(类类型)的获取
1.通过Object.getClass()方法
2.通过.class标识
3.通过Class.forName(String name)方法
4.通过context.getClassLoader().loadClass(String name)(不建议使用)
3和4中的name为类名


Class.forName()和getClassLoader().loadClass()的区别
forName会将类加载到jvm中,且进行初始化
loadClass()将类加载到jvm中,不会进行初始化


二、基本信息获取

1、类名,包名的获取
1.1.public String getName();//获取到包名 + 类名
1.2.public String getSimepleName();//仅获取到类名
1.3.public Package getPackage();//仅获取到包名 package.getName();


2、父类,超类的获取
2.1.public Class<?> getSuperclass();//获取基本类的父类
2.2.public Type getGenericSuperclass();//获取泛型类的父类


3、接口的获取
3.1.public Class<?>[] getInterfaces();//获取普通接口的方法(直接继承的接口)
3.2.public Type[] getGenericInterfaces();//获取泛型接口的方法


4、获取访问修饰符
int modifiers = clazz.getModifiers();

//根据整型变量来生成对应的修饰符字符串  
String Modifier.toString(int modifiers)   //直接返回如 public static final 
/以下这些方法来检查特定的修饰符是否存在  
boolean Modifier.isAbstract(int modifiers)  
boolean Modifier.isFinal(int modifiers)  
boolean Modifier.isInterface(int modifiers)  
boolean Modifier.isNative(int modifiers)  
boolean Modifier.isPrivate(int modifiers)  
boolean Modifier.isProtected(int modifiers)  
boolean Modifier.isPublic(int modifiers)  
boolean Modifier.isStatic(int modifiers)  
boolean Modifier.isStrict(int modifiers)  
boolean Modifier.isSynchronized(int modifiers)  
boolean Modifier.isTransient(int modifiers)  
boolean Modifier.isVolatile(int modifiers)  


三、内部信息获取
--------------------Constructor-----------------------
1、构造方法获取
//获取到类型public的构造函数
1.1.Constructor<?>[] getConstructors();

1.2.Constructor<T> getConstructor(Class<?>... paramterTypes);(根据参数类型,来获取指定的构造方法)

//获取到所有声明的构造函数(public,private,protected)
1.3.Constructor<?>[] getDeclaredConstructors();
1.4.Constructor<T>[] getDeclaredConstructor(Class<?>... parameterTypes)(根据参数类型,来获取指定的构造方法)


不光引用数据类型有Class对象,基本数据类型也有Class对象


如果参数是基本数据类型的话,需要int.class,float.class,基本数据类型也是有Class对象的
参数为精度匹配,个数,类型,顺序


2.获取Constructor的参数类型
2.1.//用于解析一般函数
Class<?> getParameterTypes();
2.2.//用于解析泛型对象
Type[] getGenericParameterTypes();


3.通过Constructor对象来构造实例
public T newInstance(Object... args);


例子:
public class Person{
    
    private String name;
    private int age;


    private Person();
    public Person(String name,int age){
        this.age = age;
        this.name = name;
    }
}


Class clazz = Person.class;
Constructor constructor =clazz.getDeclaredConstructor(String.class,int.class);
constructor.setAccessible(true);
Person bean = (Person)constructor.newInstance("构造出来的",11);


setAccessible可以设置任何函数或字段为可访问的,默认情况下public是true,private和protected是false的


4.获取Constructor构造函数的访问修饰符
int modifier = constructor.getModifiers();


--------------------------Field---------------------
1.成员变量的获取
//获取声明为public类型的成员变量
1.1.Field[] getFields();
1.2.Field getField(String name);
//获取全部的成员变量(private,public,protected)
1.3.Field[] getDeclaredFields();
1.4.Field getDeclaredField(String name);


2.Field对象的get和set操作
void set(Object object, Object value)  
Object get(Object object)  


Person person = new Person("feng",18);//因为对于field对象get,set操作的时候是需要person对象的
Class clazz = person.getClass();
Field field = clazz.getDeclareField("name");
field.setAccessible(true);
field.set(person,"fengliwei");


先通过Class对象查找获取到要修改的某一个成员变量,获取到Field对象,然后需要得到需要修改的对象,然后进行赋值


get系列函数和set系列函数
上方的get和set的参数都为Object,但是如果一个类中成员变量为基本数据类型的话,就不行了,所以提供了一系列的get,set函数
如果Object类型和基本数据类型是可以相互转换的话,则可以用普通的get,set


/设置与获取int类型的值  
void setInt(Object object, int value)  
int getInt(Object object)  
//设置与获取double类型的值  
void setDouble(Object object, double value)  
double getDouble(Object object)  
//设置与获取float类型的值  
void setFloat(Object object, float value)  
float getFloat(Object object)  
//设置与获取bool类型的值  
void setBoolean(Object object, boolean value)  
boolean getBoolean(Object object)  
//设置与获取short类型的值  
void setShort(Object object, short value)  
short getShort(Object object)  
//设置与获取long类型的值  
void setLong(Object object, long value)  
long getLong(Object object)  
//设置与获取byte类型的值  
void setByte(Object object, byte value)  
byte getByte(Object object)  
//设置与获取char类型的值  
void setChar(Object object, char value)  
char getChar(Object object)  


3.判断是否为枚举常量
//是否当前的field为枚举常量
boolean isEnumConstant()


4.获取修饰符与声明变量的类
//获取声明变量的类
4.1.Class<?> getDeclaringClass();
//获取成员变量的修饰符对应的int数字
4.2.int getModifiers();




--------------------------Method---------------------
1.成员函数的获取
//获取类型为public的成员函数
1.1.Method[] getMethods();
1.2.Method getMethod(String name,Class<?>... parameterTypes);(name为要获取的成员函数的名字,第二个参数为成员函数的参数类型数组)
//获取类型为private,public,protected的成员函数
1.3.Method[] getDeclaredMethods();
1.4.Method getDeclared(String name,Class<?>... parameterTypes);


2.执行函数
Object invoke(Object receiver,Object... args)(第一个参数为要执行方法的对象,第二个参数为方法参数的具体值)返回执行结果


3.获取参数类型
3.1.Class<?>[] getParameterTypes()
3.2.Type[] getGenericParameterTypes()


4.获取返回值类型
Class<?> getReturnType()
Type getGenericReturnType()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值