1、reflection
-
定义Student类:
public class Student { //定义字段:name private String name; //无参构造 public Student() { } //有参构造,并假设抛出RuntimeException 的异常 public Student(String name) throws RuntimeException { super(); this.name = name; } //定义无参方法 private void showName(){ System.out.println(this.name); } //定义有参方法 private static void eat(String food)throws RuntimeException{ System.out.println("我平常喜欢吃"+food); } }
-
获取Field的基本信息:
public class FieldTest { public static void main(String[] args) throws Exception{ //加载并返回student类对应的class对象 Class<?> s=Student.class; //获得s对应的类中名称是name的字段 Field f = s.getDeclaredField("name"); //从本类所声明的所有构造中获取带有指定类型参数的构造方法 Constructor<?> con = s.getConstructor(); // 通过由 Constructor 提供的方法来创建 con 所表示的类型的实例 Object o=con.newInstance(); //使f所表示的字段不管是什么权限修饰的都能够被访问 f.setAccessible(true); //给o所引用的对象的f所表示的字段赋值 f.set(o,"小种子"); //获取o引用的对象的f所表示的字段的值 Object n = f.get(o); System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>"+n); //用整数类型返回用 Field 对象表示的f所表示的字段的java访问修饰符 int mod = f.getModifiers(); //如果整数表示的字段访问修饰符是private类型则返回true,否则返回false System.out.println(Modifier.isPrivate(mod)); //返回整数所表示的访问修饰符标志的字符串 String type = Modifier.toString(mod); System.out.println(">>>>>>>>>>>>>>>>>>>>>>>"+type); //获取f所表示的字段的类型 Class<?> t = f.getType(); System.out.println(">>>>>>>>>>>>>>>>>>>"+t); //获取字段类型所对应的类名 String m = t.getName(); System.out.println(">>>>>>>>>>>>>>>>>>>>>>"+m); //获取f所表示的字段的名称 String g = f.getName(); System.out.println(">>>>>>>>>>>>>>>>"+g); } }
-
获取Method的基本信息:
public class MethodInvokeTest { public static void main(String[] args) throws Exception{ //加载并返回Student类对应的class对象 Class<?> s=Student.class; //获取s对应的类中名称为eat,且带有一个String类型参数的 方法 Method m = s.getDeclaredMethod("eat", String.class); System.out.println(">>>>>>>>>>>>>>>>"+m); //从本类所声明的所有构造中获取带有指定类型参数的构造方法 Constructor<?> con = s.getConstructor(); // 通过由 Constructor 提供的方法来创建 con 所表示的类型的实例 Object o=con.newInstance(); //使m所表示的非public修饰的方法能够被执行 m.setAccessible(true); //通过o引用的对象执行m对应的带有一个参数的实例方法 m.invoke(o,"零食"); //获取m所表示的方法的访问修饰符的整数值 int mod = m.getModifiers(); System.out.println(mod); //如果m所表示的方法的访问修饰符的类型是private则返回true,否则返回false System.out.println(Modifier.isPrivate(mod)); //获取整数值的访问修饰符的字符串 String t = Modifier.toString(mod); System.out.println(">>>>>>>>>>>>>>"+t); //获取m所表示的方法的返回值类型 Class<?> r = m.getReturnType(); System.out.println(">>>>>>>>>>>"+r.getName()); //获得m所表示的方法的名称 String g = m.getName(); System.out.println(">>>>>>>>>>>>>>>>"+g); //获取m所表示的方法的参数的类型 Class<?>[] p = m.getParameterTypes(); if(p !=null && p.length>0){ for(Class<?> c:p){ System.out.println(">>>>>>>>>>>>>>"+c.getName()); } } Class<?>[] e = m.getExceptionTypes(); if(e !=null && e.length>0){ for(Class<?> c:e){ System.out.println(">>>>>>>>>>>>>>"+c.getName()); } } } }
1.1、java.lang.Class
1.1.1、理解Class和Object
1.1.2、获得类的基本信息
- 获取类的基本信息
String getName()
以 String 的形式返回此 Class 对象所表示的实体(类、接口、数组类、基本类型或 void)名称
String getSimpleName()
返回源代码中给出的底层类的简称
String getCanonicalName()
返回 Java Language Specification 中所定义的底层类的规范化名称
int getModifiers()
返回此类或接口以整数编码的 Java 语言修饰符
- 与类型判断有关的方法
boolean isAnnotation() 如果此 Class 对象表示一个注释类型则返回 true
boolean isArray() 判定此 Class 对象是否表示一个数组类
boolean isEnum() 当且仅当该类声明为源代码中的枚举时返回 true
boolean isInterface() 判定指定的 Class 对象是否表示一个接口类型
- 与父类或所实现接口有关的方法
Class<? super T> getSuperclass()
返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的超类的 Class
Class<?>[] getInterfaces()
确定此对象所表示的类或接口实现的接口
- 与类加载有关的方法
public static Class<?> forName( String className )
返回参数指定的类名或接口名相关联的 Class 对象
public static Class<?> forName( String name , boolean initialize , ClassLoader loader )
使用给定的 "类加载器" ( loader ) ,加载指定 类名或接口名 相关联的 Class 对象,并指定是否需要初始化( initialize )
- 与内部类有关的方法
Class<?> getDeclaringClass()
如果此 Class 对象所表示的类或接口是另一个类的成员,则返回的 Class 对象表示该对象的声明类。
比如 A 类定义在 B 类内部,如果需要通过 A 获得它所在那个类,则可以通过 A.class.getDeclaringClass()
boolean isAnonymousClass()
当且仅当底层类是匿名类时返回 true
boolean isMemberClass()
当且仅当底层类是成员类时返回 true。
boolean isLocalClass()
当且仅当底层类是本地类时返回 true
1.1.3、获取Field
Field getDeclaredField( String name ) 获取指定名称的字段(仅限本类直接声明的字段、权限修饰符不限)
Field getField( String name ) 从 本类及从父类继承的所有的 public 修饰的字段 中获取指定名称对应的字段
Field[] getDeclaredFields() 获取本类中直接声明的所有的字段组成的数组(权限修饰符不限)
Field[] getFields() 获取本类及从父类继承的所有的 public 修饰的字段
1.1.4、获取Method
Method getDeclaredMethod( String name , Class<?> ... paramTypes ) 获取指定名称、带有指定类型参数的方法(仅限本类直接声明的、权限修饰符不限)
Method getMethod( String name , Class<?> ... paramTypes ) 从 本类及从父类继承的所有的 public 修饰的方法 中获取指定名称、带有指定类型参数的方法
Method[] getDeclaredMethods() 获取本类中直接声明的所有的方法组成的数组(权限修饰符不限)
Method[] getMethods() 获取本类及从父类继承的所有的 public 修饰的方法
1.1.5、获取Constructor
Constructor<?> getDeclaredConstructor( Class<?> ... paramTypes ) 从本类所声明的所有构造中获取带有指定类型参数的构造方法
Constructor<?> getConstructor( Class<?> ... paramTypes ) 从本类所有的 public 修饰的构造中获取带有指定类型参数的构造方法
Constructor<?>[] getDeclaredConstructors() 获取本类中所声明的所有的构造方法(权限修饰符不限)
Constructor<?>[] getConstructors() 获取所有的 public 修饰的构造方法