Java反射 常用的方法

Java反射API有几类?

package用来描述类所属的包
Class用来描述类本身
Field用来描述类中的属性
Method用来描述类中的方法
Constructor用来描述类中的构造方法
Annotation用来描述类中的注解

Class

# 1. Class clazz = Class.forName(“包名.类名”);        
Class clz = Class.forName("java.lang.String");                   
                                                        
# 2. Class clazz = 类名.class;                        
Class clz = String.class;                              
                                                  
# 3. 对象.getClass(); (Object类中的方法)               
Class clz = "str".getClass();              
                                                              
# 4. 基本类型的包装类的Type属性
Class<?> obj = Byte.TYPE;
obj = Short.TYPE;
obj = Integer.TYPE;
obj = Long.TYPE;
obj = Float.TYPE;
obj = Double.TYPE;
obj = Boolean.TYPE;
obj = boolean.class;
obj = Character.TYPE;

# obj.getCanonicalName()执行结果如下:
byte
short
int
long
float
double
boolean
boolean
char

基础

Package p = clazz.getPackage();                  获取所在的包
String name = p.getName());                      获取包名
String name = clazz.getName();                   获取包名+类名
String simpleName = clazz.getSimpleName();       获取类名

Class<?> superclass = clazz.getSuperclass();                获取父类
Class<?>[] classes = concreteClass.getClasses();            公共内部类(包含父类)
Class<?>[] classes = concreteClass.getDeclaredClasses();    所有内部类(不包含父类)
innerClass.getDeclaringClass().getEnclosingClass()          获取内部类的外部类,对匿名内部类也有效

Class[] classes = clazz1.getInterfaces();        获取所有接口
int midifiers = clazz.getModifiers();            获取类修饰符(包含权限+特征)
Modifier.toString(concreteClass.getModifiers())  显示修饰符

构造方法

Constructor con = clazz.getConstructor();                  获取无参数构造方法
Constructor con = clazz.getConstructor(String.class);      获取有参数构造方法
Constructor[] cons = clazz.getConstructors();              获取所有的构造方法

Constructor conabstract = clazz.getDeclaredConstructor();
Constructor conabstract = clazz.getDeclaredConstructor(String.class);
Constructor[] conabstracts = clazz.getDeclaredConstructors();

int i = con.getModifiers();
String name = con.getName();
Class[] mpts = con.getParameterTypes();
Class[] mets = con.getExceptionTypes();    

Person penson = (Person)clazz.newInstance();         相当于调用Person类默认无参数构造方法创建对象 
Person penson = (Person)con1.newInstance("娃哈哈");   由构造方法反射创建对象

参考 getDeclaringClass,getEnclosingClass
参考 getEnclosing*、getDeclared*与getDeclaringClass 区别


Field

Field field = clazz.getField("name")           获取公有属性(包含父类)
Field[] fields = clazz.getFields();

Field field = clazz.getDeclaredField("name");  获取公有 && 私有属性(仅限本类)
Field[] fields = clazz.getDeclaredFields();

int modifiers = field.getModifiers()  获取属性的修饰符
Class fclass = field.getType()        获取属性的类型
String fname = field.getName()        获取属性的名字

Person person = (Person) clazz.newInstance();  创造对象
field.setAccessible(true);                     私有的不许操作,可以设置方法的使用权
field.set(person, "小明");                      给属性赋值

String value = (String)field.get(person);      获取属性值

Method

Method m = clazz.getMethod("eat");                  获取无参数的公有方法(包含父类)
Method m = clazz.getMethod("eat",String.class);     获取一个String类型参数的公有方法(包含父类)
Method[] ms = clazz.getMethods();                   获取所有公有的方法(包含父类)
     
Method m = clazz.getDeclaredMethod("drink");                 获取公有 && 私有方法(仅限本类)
Method m = clazz.getDeclaredMethod("drink", String.class);   获取一个有String类型参数的私有方法(自己类)
Method[] ms = clazz.getDeclaredMethods();                    获取全部的私有方法(自己类)

int mm  = m.getModifiers();             获取修饰符:权限+特征
Class mr = m.getReturnType();           获取返回值数据类型的
String mn = m.getName();                获取方法的名字
Class[] mpts = m.getParameterTypes();   获取方法参数列表的类型
Class[] mets = m.getExceptionTypes();   获取方法抛出异常的类型  

m.setAccessible(true);                           私有的不许操作,可以设置方法的使用权                                                                                                                                                                       
m.invoke(person);                                执行无参数方法
String s = (String)m.invoke(person ,"娃哈哈");    执行有参数的方法   

修饰符

0默认不写
1public
2private
4protected
8static
16Modifiers
32synchronized
64volatile
128transient
256native
512interface
1024abstract

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值