1,反射、reflect:
关于反射这一章节涉及到的类型:
java.lang.Class; “Class类型的实例”代表 “某一种类型”
java.lang.reflect.Field; “Field类型的实例”代表 “某一种类型中的属性”
java.lang.reflect.Method;“Method类型的实例”代表 “某一种类型中的方法”
java.lang.reflect.Constructor; “Constructor类型的实例”代表 “某一种类型中的构造方法”
java.lang.reflect.Modifier;“Modifer类型的实例”代表 “某一种类型中的修饰符”
reflect在java中起到什么作用:
第一、有了反射机制之后我们可以完成反编译了(.class--->.java)
第二、有的时候我们需要使用反射机制让我们的程序变得更加的灵活,解耦合,这样就项目的扩展能力增强。
获取“Class类型的实例”的三种方式:
第一种方式:Classc = Class.forName("带有包名的类全名");
//注意:任何一个类名在这里都要带上包名。java.lang也不例外。
第二种方式:Classc = 引用.getClass();
第三种方式:java中任何一个类型都有.class属性。
2, 有关CLass的 函数:
Class.forName("完整类名"); |
这段代码的作用是将“类”加载到JVM中。将MyClass.class文件加载到JVM中。 |
c .newInstance() |
拿到Class之后,可以通过Class中的此方法,创建此 Class 对象所表示的类的一个新实例 |
Class superclass = c.getSuperclass(); |
获取父类型 |
Class[] allInterfaces = c.getInterfaces(); |
获取父类型接口 可有很多接口 所以是负数 |
Field[] fs = c.getFields(); |
获取User类型中所有公开的属性 |
Field[] fs = c.getDeclaredFields();
getDeclaredField(String name); |
获取User类型中所有的属性,包括私有的属性。
返回以声明的字段 (name 的属性) |
|
返回 类的 修饰符 |
c.getSimpleName() |
类 名 简称 |
getDeclaredMethod(String name, Class<?>... parameterTypes) |
返回一个 Method 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明方法。 |
getDeclaredMethods() |
返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。
|
有关Field的函数:
usernameField.set(o,"admin"); |
修改 set |
Object retValue = usernameField.get(o); |
读取 get 返回指定对象上此 Field 表示的字段的值。 |
Field usercodeField = c.getDeclaredField("usercode"); |
|
usercodeField.setAccessible(true); |
打破封装(如果是私有) 取消访问限制 |
Modifier.toString(f.getModifiers()) |
|
c.getModifiers() |
返回 属性的 修饰符 |
Constructor[] cons = c.getDeclaredConstructors(); |
|
Constructor con = c.getDeclaredConstructor(int.class,String.class,double.class); |
|
有关Method的函数:
TypeVariable<Method>[] getTypeParameters() |
返回 TypeVariable 对象的数组,这些对象描述了由 GenericDeclaration 对象表示的一般声明按声明顺序来声明的类型变量。 |
Object invoke(Object obj, Object... args) |
对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。 |
Class<?>[] getParameterTypes() |
按照声明顺序返回 Class 对象的数组,这些对象描述了此 Method 对象所表示的方法的形参类型。 |
有关构造函数的:
Object o = con.newInstance(7777,"KING",10000.0); |
调用 与普通方法区别: invoke |
Constructor con = c.getDeclaredConstructor(int.class,String.class,double.class); |
不是数组 ,指定的构造函数 |