Java注解是附加在代码中的一些元信息,用于一些工具在编译、运行时进行解析和使用,起到说明、配置的功能。
注解是以“@注释名”在代码中存在的,还可以添加一些参数值,例如:@SuppressWarnings(value=“unchecked”)
可以附加在package、class、methdo、field等上面。相当于给他们添加了额外的辅助信息,我们可以通过反射机制实现对元数据的访问。
元注解:修饰注解的注解,java定义了4个标准的meta-annotation类型。他们被用来提供对其他annitation类型的说明。
@Document:说明改注册将被包含在javadoc中
@Inherited: 说明子类可以继承父类的注释
用户根据自己的需求自定义注解
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE,ElementType.METHOD})
public @interface MyAnnontation {
String name() default "";
String value();
}
@MyAnnontation(name ="aaaa",value = "bbbbb")
public class testAnontation {
public testAnontation(){
}
}
Class<testAnontation> c= testAnontation.class;
MyAnnontation declaredAnnotation = c.getDeclaredAnnotation(MyAnnontation.class);
String name1 = declaredAnnotation.name();
System.out.println(name1);
是一类在运行时可以改变其结构的语言:例如新的函数、对象、甚至代码可以被引进。已有的函数可以被删除或是其他结构上的变化。通俗点就是运行时代码可以根据某些条件改变自身结构、
主要动态语言:Object-C、C#、JavaScript、PHP、Python
与动态语言相对应,运行时结构不可变的语言就是静态语言。如Java、C、C++
Java不是动态语言。但Java可以称之为“准动态语言”。即Java有一定的动态性,我们可以利用反射机制获得类似动态语言的特性。Java的动态性让编程更加灵活。
Reflection(反射)是Java被视为动态语言的关键。反射机制允许程序在执行期借助于Reflection API取的任何类的内部信息,并且能直接操作任意对象的内部属性及方法。
加载完类后,在堆内存的方法区中就产生一个Class类型的对象(一个类只有一个Class对象),这个对象就包含了完整的类结构信息。我们可以通过这个对象看到类的结构。这个对象就想一面镜子。透过这个镜子看到类的结构。所有称之为反射
Class clazz = Person.class;
Class clazz = person.getClass();
Class clazz = Class.forName("demo01.Student");
类加载器作用是把类(class)类装进内存。JVM规范定义了如下
public interface Dosm {
String sing();
}
public class Star implements Dosm {
private String name;
public Star(String name){
this.name=name;
}
@Override
public String sing() {
System.out.println(name+":唱歌");
return "谢谢";
}
}
newProxyInstance(ClassLoader loader,Class>[] interfacesInvocationHandler h)
public class ProxyUtil {
public static Dosm createProxy(Star star){
Dosm dosm= (Dosm) Proxy.newProxyInstance(ProxyUtil.class.getClassLoader(), new Class[]{Dosm.class}, new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if("sing".equals(method.getName())){
System.out.println("先收钱");
}
String str = (String) method.invoke(star);
System.out.println(str);
return str;
}
});
return dosm;
};
}