java编程/提升

java反射--善用反射等于写活“代码“

2020-07-19  本文已影响0人  程序员ken

/**

*/

//获取修饰符,返回值可通过Modifier类进行解读

//获取父类,如果为Object,父类为null

public native Class<? super T> getSuperclass();

//对于类,为自己声明实现的所有接口,对于接口,为直接扩展的接口,不包括通过父类间接继承来的

public native Class<?>[] getInterfaces();

public Annotation[] getDeclaredAnnotations();

public Annotation[] getAnnotations();

public <A extends Annotation> A getAnnotation(Class<A> annotationClass);

public boolean isAnnotationPresent(Class<? extends Annotation> annotationClass);

//获取所有的public的内部类和接口,包括从父类继承得到的

public Class<?>[] getDeclaredClasses();

public Class<?> getDeclaringClass();

public Class<?> getEnclosingClass();

public Method getEnclosingMethod();

public native boolean isArray();

public native boolean isPrimitive();

public native boolean isInterface();

public boolean isEnum();

public boolean isAnnotation();

public boolean isAnonymousClass();

public boolean isMemberClass();

public boolean isLocalClass();

JAVA反射原理
什么是反射?
反射,一种计算机处理方式。是程序可以访问、检测和修改它本身状态或行为的一种能力。java反射使得我们可以在程序运行时动态加载一个类,动态获取类的基本信息和定义的方法,构造函数,域等。除了检阅类信息外,还可以动态创建类的实例,执行类实例的方法,获取类实例的域值。反射使java这种静态语言有了动态的特性。
java反射机制是围绕Class类展开的,在深入java反射原理之前,需要对类加载机制有一个大致的了解。jvm使用ClassLoader将字节码文件(class文件)加载到方法区内存中:
而java中的Class类对象是可以人工自然性的(也就是说开放的)得到的(虽然你无法像其他类一样运用构造器来得到它的实例,因为
Class对象都是jvm产生的。不过话说回来,客户产生的话也是无意义的),而且,更伟大的是,基于这个基础,java实现了反射机制。
获取Class对象有三种方式:
1.通过Object类的getClass()方法。例如:
Class c1 = new String("").getClass();
2.通过Class类的静态方法——forName()来实现:
Class c2 = Class.forName("MyObject");
3.如果T是一个已定义的类型的话,在java中,它的.class文件名:T.class就代表了与其匹配的Class对象,例如:

实际运用:(
)注解+反射 自动生成实体类的sql语句(可以批量生成数据库表 或 批量新增表字段 两个功能)

1、元注解(meta-annotation):
  
元注解的作用就是负责注解其他注解。Java5.0定义了4个标准的meta-annotation类型,它们被用来提供对其它 annotation类型作说明。Java5.0定义的元注解:    1.@Target,    2.@Retention,    3.@Documented,    4.@Inherited  这些类型和它们所支持的类在java.lang.annotation包中可以找到。下面我们看一下每个元注解的作用和相应分参数的使用说明。

@Target说明了Annotation所修饰的对象范围:Annotation可被用于 packages、types(类、接口、枚举、Annotation类型)、类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循环变量、catch参数)。在Annotation类型的声明中使用了target可更加明晰其修饰的目标。
  
作用:用于描述注解的使用范围(即:被描述的注解可以用在什么地方)

2.FIELD:用于描述域    3.LOCAL_VARIABLE:用于描述局部变量    4.METHOD:用于描述方法    5.PACKAGE:用于描述包    6.PARAMETER:用于描述参数    7.TYPE:用于描述类、接口(包括注解类型) 或enum声明

定义了该Annotation被保留的时间长短:某些Annotation仅出现在源代码中,而被编译器丢弃;而另一些却被编译在class文件中;编译在class文件中的Annotation可能会被虚拟机忽略,而另一些在class被装载时将被读取(请注意并不影响class的执行,因为Annotation与class在使用上是被分离的)。使用这个meta-Annotation可以对 Annotation的“生命周期”限制。
  
作用:表示需要在什么级别保存该注释信息,用于描述注解的生命周期(即:被描述的注解在什么范围内有效)

2.CLASS:在class文件中有效(即class保留)    3.RUNTIME:在运行时有效(即运行时保留)

image
image 2.第二步:实体上写上该注解,并利用反射读取(大致思路是读取含义@TableName的自定义注解,绝对生成sql的标签,判断是否创表还是新增,后面根据**
@SetTable判断主键,自增,类型,长度,精度,别名,备注等)
image
image
image
上一篇下一篇

猜你喜欢

热点阅读