注解
元注解
@Target:用于描述注解的使用范围(被描述的注解可以在什么地方使用)
@Retention:表示需要在什么级别保存该注释信息,用于描述注解的生命周期(SOURCE<CLASS<RUNTIME)
@Document:该注解被包含在javadoc中
@Inherited:该子类可以继承父类中该注解
自定义注解
使用@interface自定义注解 自动继承java.lang.annotion.Annotation接口
public class test2 { @Annonation(age = 15,name1 = {"清华大学","湘潭"}) public void test(){ } @Annonation1("靓仔") public void test1(){ } //可以在方法和类上使用 @Target({ElementType.TYPE,ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @interface Annonation{ //注解中的参数格式 参数名(); 不是方法 String name() default "我是注解"; int age(); String[] name1(); } @Target({ElementType.TYPE,ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @interface Annonation1{ String value();//默认写value } } @Annontation2() public void test(){ } @Target({ElementType.METHOD,ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @interface Annontation2{ // -1默认为没有 int value() default -1; } }
反射机制 java Reilection
java反射机制能提供的功能
在运行时判断任意一个对象所属的类
在运行时构造任意一个类的对象
在运行时判断任意一个类所具备的成员变量和方法
在运行时获取泛型信息
在运行时用任意一个对象的成员变量和方法
在运行时处理注解
生成动态代理
.....
优点:可以实现动态代理创建对象和编译 很灵活
缺点:对性能有很大影响,使用反射基本上上时一种解释操作,告诉JVM 我们希望什么并且满足我么的要求,这类操作总是慢于直接执行相同的操作
一个类在内存中只有一个class对象
public static void main(String[] args) throws ClassNotFoundException { //通过反射获取类的class对象 Class clazz = Class.forName("com.test.User"); System.out.println(clazz); //一个类在内存中只有一个class对象 //一个类被加载后,类的整个结构都会被封装在class对象中 Class clazz1 = Class.forName("com.test.User"); Class clazz2 = Class.forName("com.test.User"); Class clazz3 = Class.forName("com.test.User"); System.out.println(clazz == clazz1); }
Class类
所有的子类都继承了 public final Class getClass()
返回的是一个Class类,这是反射的源头。就是通过对象反射求出类的名称
static ClassforName(String name) 返回指定类名name的class对象
Object newInstance() 调用缺省构造函数,返回Class对象的一个实例
getName()返回此Class对象所表示的实体(类,接口,数组类或void)的名称
CLass getSuperClass()返回当前Class对象的父类Class对象
Class[] getinterfaces() 获取当前Class对象的接口
ClassLoader getClassLoader()返回该类 的类加载器
Constructor[] getConstructors() 返回一个包含某些Contructor对象的数组
Method getMothed(String name,Class .. T) 返回一个Method对象,此对象的形参类型为paramType
Field[] getDeclaredFields() 返回Filed对象的一个数组
获取Class类的实例
一直具体的类,通过类的class属性获取,该方法最为安全可靠,程序性能最高
已知具体的类,通过类的class属性获取,该方法最为安全可靠,程序性能最高 Class clazz = Person.class; 已知某个类的实例,调用该实例的getcLASS()方法获取CLass对象 class clazz = person.getClass(); 一直一个类的全类名,且该类在类路径下,可通过CLass类的静态方法forName()获取,肯抛出ClassNotFoundException class clazz = Class.forNameException("demo01,student"); 内置基本数据类型可以直接用类名.Type 还可以利用ClassLoader..
class 类,interface 接口,[] 数组,enum 枚举,annotation 注解@interface ,primitive type 基本数据类型,void 都是有class对象的
元素类型与维度一样,他们就是同一个对象
全部评论
(0) 回帖