所有类的对象其实都是Class的实例
获取是类对象的方式:

package Reflect; class Demo{ //other codes... } class hello{ public static void main(String[] args) { Class<?> demo1=null; Class<?> demo2=null; Class<?> demo3=null; try{ //一般尽量采用这种形式 demo1=Class.forName("Reflect.Demo"); //Class<?> cls = Class.forName(obj.getClass().getName); }catch(Exception e){ e.printStackTrace(); } demo2=new Demo().getClass(); demo3=Demo.class; System.out.println("类名称 "+demo1.getName()); System.out.println("类名称 "+demo2.getName()); System.out.println("类名称 "+demo3.getName()); } }

通过获取类的对象来整出所有关于这个类的信息的一个东西 //取得全部的构造函数 Constructor<?> cons[]=demo.getConstructors(); //实例化对象的构造函数 per1=(Person)cons[0].newInstance(); //取得父类 Class<?> temp=demo.getSuperclass(); // 取得本类的全部属性 Field[] field = demo.getDeclaredFields(); for (int i = 0; i < field.length; i++) { // 权限修饰符 int mo = field[i].getModifiers(); String priv = Modifier.toString(mo); // 属性类型 Class<?> type = field[i].getType(); System.out.println(priv + " " + type.getName() + " " + field[i].getName() + ";"); } System.out.println("===============实现的接口或者父类的属性========================"); // 取得实现的接口或者父类的属性 Field[] filed1 = demo.getFields(); for (int j = 0; j < filed1.length; j++) { // 权限修饰符 int mo = filed1[j].getModifiers(); String priv = Modifier.toString(mo); // 属性类型 Class<?> type = filed1[j].getType(); System.out.println(priv + " " + type.getName() + " " + filed1[j].getName() + ";"); }
Field
反照获取对象成员的字段值,getFields()和getDeclaredFields()用法区别
getFields()只能获取public的字段,包括父类的。
getDeclaredFields()只能获取自己声明的各种字段,包括public,protected,private。
(api:http://www.apihome.cn/api/java/Field.html)
Field 基本上和注解(Annotation)结合用的多些
setAccessible(boolean bool)
值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。可以访问私有域
值为 false 则指示反射的对象应该实施 Java 语言访问检查。 即不能访问私有域
值为 false 则指示反射的对象应该实施 Java 语言访问检查。 即不能访问私有域
Annotation:
元注解是指注解的注解。包括 @Retention @Target @Document @Inherited四种,四中对应的参数值分别为:
@Target 表示该注解目标,可能的 ElemenetType 参数包括:
ElemenetType.CONSTRUCTOR 构造器声明 ElemenetType.FIELD 域声明(包括 enum 实例) ElemenetType.LOCAL_VARIABLE 局部变量声明 ElemenetType.METHOD 方法声明 ElemenetType.PACKAGE 包声明 ElemenetType.PARAMETER 参数声明 ElemenetType.TYPE 类,接口(包括注解类型)或enum声明
2. @Retention 表示该注解的生命周期,可选的 RetentionPolicy 参数包括
RetentionPolicy.SOURCE 注解将被编译器丢弃
RetentionPolicy.CLASS 注解在class文件中可用,但会被VM丢弃
RetentionPolicy.RUNTIME VM将在运行期也保留注释,因此可以通过反射机制读取注解的信息
3. @Documented 指示将此注解包含在 javadoc 中
4. @Inherited 指示允许子类继承父类中的注解
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface AIDeleteKey { /** * 表示插入数据时是否同时也插入主键到表。默认为false,即表的主键应该为自动生�? * @return */ String value() default ""; }