利用Class获取类的属性信息import java.lang.reflect.Modifier;
class A { } interface B{ } interface C{ }public class BaseDemo3 extends A implements B,C{ //内部类 public class C{} public interface D{} public static void main(String[] args) { //类可以,接口也可以 Class<BaseDemo3> c = BaseDemo3.class; System.out.println(c);//class junereflect624.BaseDemo3 //得到包名 System.out.println(c.getPackage());//package junereflect62; //得到全限定名 System.out.println(c.getName());//junereflect624.BaseDemo3 //得到类的简称 System.out.println(c.getSimpleName());//BaseDemo3 //得到父类 /** * Class<? super T> getSuperclass() 此处super表示下限 返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的超类的 Class 。*/ System.out.println(c.getSuperclass().getSimpleName());//A,先获取父类,再获取父类的简称 //得到接口 System.out.println(c.getInterfaces());//[Ljava.lang.Class;@1b60280 Class[] arr = c.getInterfaces(); for (Class cla : arr) { System.out.println(cla);//interface junereflect624.B interface junereflect624.C } //获得public修饰的类 /** * Class<?>[] getClasses() 返回一个包含某些 Class 对象的数组,这些对象表示属于此 Class 对象所表示的类的成员的所有公共类和接口 。(如果内部类前面没有加上public的话那么得不到!) */ Class[] cl = c.getClasses(); System.out.println(cl.length);//在内部类没有加上public修饰的时候长度为0,加上就是2(获取的是公共的) for (Class class1 : cl) { System.out.println(class1); } //获得修饰符 int i = c.getModifiers(); System.out.println(i);//常量值1表示public System.out.println(Modifier.toString(i));//直接打印出public }}Class中得到构造方法Constructor、方法Method、字段Field常用方法:
Constructor类用于描述类中的构造方法:
Constructor<T> getConstructor(Class<?>... parameterTypes)
返回该Class对象表示类的指定的public构造方法;
Constructor<?>[] getConstructors()
返回该Class对象表示类的所有public构造方法;
Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)
返回该Class对象表示类的指定的构造方法,和访问权限无关;
Constructor<?>[] getDeclaredConstructors()
返回该Class对象表示类的所有构造方法,和访问权限无关;
Method类用于描述类中的方法:
Method getMethod(String name, Class<?> ... parameterTypes)
返回该Class对象表示类和其父类的指定的public方法;
Method[] getMethods():
返回该Class对象表示类和其父类的所有public方法;
Method getDeclaredMethod(String name, Class<?>... parameterTypes)
返回该Class对象表示类的指定的方法 。和访问权限无关,但不包括继承的方法;
Method[] getDeclaredMethods(): 获得类所有的方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法;
Eg:
import java.lang.reflect.Constructor;
class Emp{ private String name; private int age; private Emp() { } Emp(String name){ } public Emp(String name,int age){ }}public class ConstructorDemo4 { public static void main(String[] args) throws Exception { //得到所有的构造器(先得到类) Class<Emp> c = Emp.class; /** * Constructor<?>[] getConstructors() 返回一个包含某些 Constructor 对象的数组,这些对象反映此 Class 对象所表示的类的所有公共构造方法 。*/ Constructor[] con = c.getConstructors();//前面的修饰符必须是public才可以在这个方法下获取到 for (Constructor cons : con) { System.out.println("c.getConstructors()"+cons);//如果上面的某构造器public去掉,则显示不出 /**打印 public junereflect624.Emp(java.lang.String,int) */ }//得到指定的构造器,也是必须public Constructor c1 = c.getConstructor(String.class,int.class); System.out.println(c1);//public junereflect624.Emp(java.lang.String,int) System.out.println("====================================");//现在想获得不受public影响的,getDeclaredConstructors(),暴力反射con = c.getDeclaredConstructors(); for (Constructor cons : con) {System.out.println("c.getDeclaredConstructors()=="+cons);//此时不受修饰符的影响 /**打印 * public junereflect624.Emp() public junereflect624.Emp(java.lang.String) public junereflect624.Emp(java.lang.String,int) */ } }}import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
class AB{protected String name;protected String id; }@Deprecatedpublic class MethodDemo5 extends AB{ void show(){} public void say(){} private int age; public char c; private boolean b; public static void main(String[] args) throws Exception { Class<MethodDemo5> c = MethodDemo5.class; //获取所有的(包含父类的方法)public修饰的方法 Method[] m = c.getMethods(); for (Method method : m) { System.out.println(method); } //总结:4个方法,获取全部,获取特定;不受修饰符影响的全部,不受修饰符影响的特定;(前两个都还是受限制的) //获取指定的方法 Method me = c.getMethod("main", String[].class); System.out.println("main "+me);//main public static void junereflect624.MethodDemo5.main(java.lang.String[]) throws java.lang.Exception //访问所有方法,不受访问权限影响 m = c.getDeclaredMethods(); for (Method method : m) { System.out.println("不受影响的:"+method); } me = c.getDeclaredMethod("show"); System.out.println(me);//void junereflect624.MethodDemo.show() me = c.getMethod("toString"); System.out.println(me);//public java.lang.String java.lang.Object.toString() /** * Method[] getDeclaredMethods() 返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法,只可以对当前类有效 */ /*me = c.getDeclaredMethod("toString");//ERROR,c.getDeclaredMethod()不能得到继承的方法 System.out.println(me);//public java.lang.String java.lang.Object.toString() */ //得到字段 Field[] f = c.getFields(); for (Field field : f) {//只得到了public的 System.out.println("字段"+field); } //特定字段 Field fi = c.getField("c");//""里面是名称 System.out.println(fi);//public char junereflect624.MethodDemo.c //得到不受限定名限定的全部字段 f = c.getDeclaredFields(); for (Field field : f) {//得到不受修饰符限定的字段,但是只对当前类有效 System.out.println("全部字段:"+field); /** * 全部字段:private int junereflect624.MethodDemo.age * 全部字段:public char junereflect624.MethodDemo.c * 全部字段:private boolean junereflect624.MethodDemo.b */ } //注释 Annotation Annotation[] a = c.getAnnotations(); System.out.println(a.length); for (Annotation annotation : a) { System.out.println(annotation); } //特定注解 Deprecated d = c.getAnnotation(Deprecated.class); System.out.println(d); }}
推荐阅读
- 冬至可以去医院看望病人吗,冬至去医院看病人好吗
- 我的野蛮女友影评最好 最好看的韩国电影我的野蛮女友
- 普洱茶发展走势被看好
- 梦见别人看我手相说我姻缘不好 梦见别人看我手相算命
- 我要是男的,也想娶一个日本老婆!看看日本主妇如何将生活过成诗
- 世界十大啤酒品牌排名,看看你喝过几个?
- 在售楼处看沙盘需要注意哪些问题?
- 房贷申请是看多久的银行流水
- 油泡左口鱼
- 翡翠|对原料要求较高的翡翠饰品是什么?别看个头小,价格却很高
