Java语法-反射、注解(及APT)、泛型、动态代理

反射

获取Class
//法一,对象.getClass,不适用于int等基础类型
Class clazz = new Person().getClass
//法二,.Class
Class clazz = Person.Class
//法三,包名
try {
    Class clazz = Class.forName("com.android.test.Person");
} catch (ClassNotFoundException e) {
    e.printStackTrace();
}
Class内容清单获取

获取Name

/**
 * 获取类型限定类名,例如:
 * 引用类Person => com.android.text.Person
 * 内部类 => com.frank.test.Outter$Inner
 * 基础类型int => int 
 * 数组string[][] => [[Ljava.lang.String
 **/

clazz.getName();
/**
 * 获取类型名,例如:
 * 引用类Person => Person
 * 内部类 => Inner
 * 匿名内部类 => 空
 * 基础类型int => int 
 * 数组string[][] => String[][]
 **/
Class.getSimpleName();
/**
 * 获取对象的官方名字,也是全限定类名,例如:
 * 引用类Person => com.android.text.Person
 * 内部类 => com.frank.test.Outter.Inner
 * 匿名内部类 => null
 * 局部类 => null
 * 基础类型int => int 
 * 数组string[][] => Ljava.lang.String[][]
 **/
 Class.getCanonicalName();
 
获取修饰符

四大类:限制作用域(public等)、abstract、static、注解

类修饰符是通过一个int来记录的,Person.class.getModifiers()即可获得 如1025之类的数字,它就记录着该类的修饰符,可通过Modifier来解读Modifier.toString(TestModifier.class.getModifiers())即可打印出该类的修饰符

获取Class的Field(成员属性)、Method(方法)、Constructor(构造器)
获取Field

//获取所有的属性,但不包括从父类继承下来的属性
Field[] getDeclaredFields()

//获取自身的所有的 public 属性,包括从父类继承下来的。
Field[] getFields()
//获取Method

Method getDeclaredMethod(String name, Class<?>... parameterTypes)

Method getMethod(String name, Class<?>... parameterTypes)

Method[] getDeclaredMethods()

Method getMethod(String name, Class<?>... parameterTypes) 
//获取Constructor,因为Constructor无法从父类继承,所以无法获取父类的Constructor

Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)

Constructor<T> getConstructor(Class<?>... parameterTypes)

Constructor<?>[] getDeclaredConstructors()

Constructor<?>[] getConstructors()

Filed Method Contructor 的 操控

Field

//获取变量名 mPerson
getName()
//获取详细类型名 java.util.List<com.android.test.Person>
Type getGenericType()
//获取类型名 java.util.List
Class<?> getType
//修饰符获取,与Class的雷同
int getModifiers()
//实例化一个对象
Person person = (Person)Person.class.newInstance();

Person clazz = Person.class
Field name = clazz.getField("name");
//如果访问的Field是private的则还需要如下设置
name.setAccessible(true);
//内容获取,Field提供了各种get方法
name.getString(person);
//内容赋值,Field提供了各种set方法
name.setString(person,"huangshunbo");

Method

//获取方法名
getName()
//获取修饰符
getModifiers()
//获取所有参数
Parameter[] getParameters()
//获取所有的参数类型
Class<?>[] getParameterTypes()
//获取所有的参数类型,包括泛型
Type[] getGenericParameterTypes()
//获取返回值类型
Class<?> getReturnType()
//获取返回值类型包括泛型
Type getGenericReturnType()
//获取异常类型
Class<?>[] getExceptionTypes()
Type[] getGenericxceptionTypes()
//执行方法
invoke(Object obj,Object... args)
Parameter操作
//获取参数名字
getName
//获取参数类型
Class<?> getType()
//获取参数的修饰符
int getModifiers()

Constructor

//创建实例Class.newInstance()和Constructor.newInstance()

//Class.newInstance() 只能
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值