标签:ado time 没有 field 验证 关闭 技术 动态 其他
注解以“@注解名”在代码中存在,可以添加一些参数;可以通过反射机制实现对这些元数据的访问
定义一个注解
@Target(value = ElementType.METHOD) @Retention(value = RetentionPolicy.RUNTIME) @Inherited @Documented public @interface MyAnnotation { }
@Target(value = ElementType.METHOD) @Retention(value = RetentionPolicy.RUNTIME) @Inherited @Documented public @interface MyAnnotation { //参数类型 参数名 默认值 String name() default ""; int age() default 0; }
public class JavaTest { public static void main(String[] args) throws Exception { //通过反射获取类的全部信息 Class class1=Class.forName("com.deng.jd.b"); //获取类上的注解 Annotation[] annotations=class1.getAnnotations(); System.out.println(annotations); //获取指定注解 MyAnnotation myAnnotation= (MyAnnotation) class1.getAnnotation(MyAnnotation.class); //获取注解的参数 System.out.println(myAnnotation.name()); //获取类指定属性上的注解 Field name=class1.getDeclaredField("name"); MyAnnotation myAnnotation1=name.getAnnotation(MyAnnotation.class); System.out.println(myAnnotation1); } }
运行时可以改变其结构的语言就是动态语言,如PHP,Python等,Java不是动态语言,单可以被称为准动态语言,可以使用反射机制获取类似动态语言的特性。
反射机制允许程序在执行期间借助ReflectionAPI获取任何类的内部信息,并能直接操作任意对象的内部属性及方法。
在加载玩类后,在堆内存的方法区中产生了一个Class类型的对象,该对象包含了完整的类的结构信息,可以通过该对象看到类的结构这就是反射
在Object类中定义了public final Class getClass()方法,被所有子类继承,其返回类型是一个Class类,此类是反射的源头
获取Class类对象的方式
public class JavaTest { public static void main(String[] args) throws Exception { Student xm=new Student(); //方法1:通过实例对象获得 Class class1=xm.getClass(); //方法2:通过类名获得(包名+类名) Class class2=Class.forName("com.deng.jd.Student"); //方法3:通过类的静态成员变量class获得 Class class3=Student.class; //对于基本数据类型的包装类,通过TYPE可以获得 Class class4=Integer.TYPE; //获得父类类型 Class class5= class1.getSuperclass(); System.out.println(class1); System.out.println(class2); System.out.println(class3); System.out.println(class4); System.out.println(class5); } }
Class类常用方法
public class JavaTest { public static void main(String[] args) throws Exception { //静态方法,获取指定名称的Class对象 Class class2=Class.forName("com.deng.jd.Student"); //创建实例对象 Student student1=(Student) class2.newInstance(); //获取类名 System.out.println(class2.getName()); //获取父类 System.out.println(class2.getSuperclass()); //获取当前类的接口 Class[] classes=class2.getInterfaces(); for(Class class3:classes){ System.out.println(class3.getName()); } //获取该类的类加载器 System.out.println(class2.getClassLoader()); //获取该类的构造器 Constructor[] constructors=class2.getConstructors(); System.out.println(constructors); //获取类的所有属性 Field[] fields=class2.getDeclaredFields(); for (Field f:fields) { System.out.println(f); } } }
当程序主动使用某一类时,如果该类还没被加载到内存中,系统会通过3个步骤对类进行初始化
通过反射可以获取运行时类的完整结构:
可以通过构造器getDeclaredConstructor(Class … parameterTypes)或者newInstance方法创建类对象
可以通过getMethod(String name,Class…parameterTypes)获取方法,通过Object invoke(Object obj, Object[] args)调用方法
标签:ado time 没有 field 验证 关闭 技术 动态 其他
原文地址:https://www.cnblogs.com/python-road/p/14693474.html