反射常用的方法总结
(1):获取class对象的三种方法
//方式一 :通过对象的getClass()方法
Class<?> clazz1 = object.getClass();
//获取对象的实例
Object instance = clazz1 .newInstance();
/*
* 方式二 :通过类名获取class对象,加入类名为FieldName
* Class<?> clazz2 = FieldName.class
* 方式三:通过Class类的静态方法forName(String className)
* Class <?> clazz3 = Class.forName("FieldName")
*
*/
(2)获取类的名字
String name = clazz1.getName();//获取类的全限定名
String simpleName = clazz1.getSimpleName();// 获取不含包名的类名
int modifiers = clazz1.getModifiers();//获取类的修饰符
//然后通过使用 java.lang.reflect.Modifier 类中的方法来检查修饰符的类型:
Modifier.isAbstract(int modifiers);
Modifier.isFinal(int modifiers);
Modifier.isInterface(int modifiers);
Modifier.isNative(int modifiers);
Modifier.isPrivate(int modifiers);
Modifier.isProtected(int modifiers);
Modifier.isPublic(int modifiers);
Modifier.isStatic(int modifiers);
Modifier.isStrict(int modifiers);
Modifier.isSynchronized(int modifiers);
Modifier.isTransient(int modifiers);
Modifier.isVolatile(int modifiers);
Package package = clazz1.getPackage();//Class 对象通过该方式获取包信息
Class superclass = clazz1.getSuperclass();//获取父类信息
Class[] interfaces = clazz1.getInterfaces()//获取实现的接口
Constructor[] constructors = clazz1.getConstructors();//获取构造器
(3)获取对象的方法
//参数:methodName: 表示被调用方法的名字 parameterTypes:表示被调用方法的参数的Class类型如String.class
//表示获取 指定 本类中的一个的公共public方法,不包括继承父类的方法
Method declaredMethod = clazz1.getDeclaredMethod(String methodName,Class<?>...parameterTypes);
//获取类自身所有方法(不包括继承父类的方法)
Method[] declaredMethods = clazz1.getDeclaredMethods();
//只能获取 指定 本类中一个的公共public方法,包括父类public的方法,但不包括父类的默认权限和private方法
Method[] methods = clazz1.getMethod(String methodName,Class<?>...parameterTypes);
//获取自身类和父类的所有public方法,包括继承的,但不包括父类的默认权限和private权限方法
Method[] methods = clazz1.getMethods();
(4)获取对象的属性(权限同方法)
Field field1 = clazz1 .getField(String name);
Field[] fields = clazz1 .getFields();
Field declaredField = clazz1 .getDeclaredField(String name);
Field[] declaredFields1 = clazz1 .getDeclaredFields();
(5 )获取属性的值
public static void getItemReflectValue(Object obj,String fieldName) {
// 得到类对象
Class clazz = (Class) obj.getClass();
Object instance = clazz.newInstance();
if (obj == null) return;
Field[] fields = clazz.getDeclaredField(fieldName);
for (Field field:fields) {
field.setAccessible(true);//设置可访问
//给字段设置值,和属性的数据类型一致,若为Integer,赋值的时候就必须赋int类型的数值
field1.set(instance, "曹操");
try {
System.out.print(fields[j].get(obj));
} catch (Exception e) {
e.printStackTrace();
}
}
}