Java.Annotation:注解
@Override:定义在java.lang.Override中,此注释值适用于修辞方法,表示一个方法声明打算重写超类中的另一个方法声明
@Deprecated:定义在java.lang.Deprecated中,此注释可以用于修辞方法,属性,类,表示等不鼓励程序员使用这样的元素,通常是因为它很危险或者存在更好的选择
@SuppressWarnings:定义java.lang.SuppressWarnings中,用来抑制编译时的警告信息
与前两个注释有所不同,需要添加一个参数才能正确的使用,这些参数都是定义好的,我们有选择的使用就好了
例如:
@SuppressWarning("all")
@SuppressWarning("unchecked")
@SuppressWarning(value={"unchecked","deprecation"})
作用:负责注解其他注解(是注解的注解),java定义了4个标准的meta-annotation类型,他们被用来提供对其annotation类型作说明
这些类型和他们所支持的类在java.lang.annotation包中科院找到。(@Target,@Retention,@Documented,@Inherited)
package com.zhou3.Annotation;
import java.lang.annotation.*;
/*
测试元注解
*/
@MyAnnotation
public class Test01 {
public static void main(String[] args) {
}
@MyAnnotation
public void test(){
}
}
//定义一个注解
// Target定义的注解想要放在那个地方(方法,类)
@Target(value = {ElementType.METHOD,ElementType.TYPE})
//Retention在什么时候还有效(运行时)
// runtime>class>sources
@Retention(value = RetentionPolicy.RUNTIME)
//表示是否将注解生成到javaDoc文档中
@Documented
//表示子类可以继承父类的注解
@Inherited
@interface MyAnnotation{
}
使用@interface 自定义注解时,自动继承了java.lang.annotation接口
注意点:
java.Reflection包下
是java语言成为准动态语言的基础
注意:(这个Class有点像一个类的母版)
一个类在内存中只有一个Class对象
一个类被加载后,类的整个结构都会被封装在Class中
动态语言:
是一类在运行时,可以改变器结构的语言(代码在运行时可以根据某些条件改变自身的结构)
主要的动态语言:Object-C、C#、JavaScript、PHP、Python
静态语言:
与动态语言对应,运行时结构不可变的语言就是静态语言,如Java、c、c++
Java不是动态语言,但是Java可以称之为“准动态语言”。即Java有一定的动态性。我们可以利用反射机制获得类似动态语言的特性。而这种动态性让编程更加灵活
Reflection(反射)是Java被视为动态语言的关键,反射机制允许程序在执行期间,借助Reflection API获得任何类的内部信息,并能直接操作任意对象的内部属性及方法
加载完类之后,砸死堆内存的方法区就产生了一个Class类型的对象(一个类只有一个Class对象),这个对象包含了完整的类的结构信息。我们可以通过这个对象看到类的结构。这个对象就像一面镜子,透过这个镜子看到类的结构,所有,我们将其形象的称之为反射
java.lang.Class:代表一个类
java.lang.reflect.Method:代表类的方法
java.lang.reflect.Field:代表类的变量
java.lang.reflect.Constructor:代表类构造器
对象在照镜子之后可以得到的信息:某个类的属性、方法和构造器、某个类到底实现了那些接口,对于每个类而言,JRE都为其保留一个不变的Class类型的对象。一个Clas对象包含了特点某个结构(class/interface/enum/annotation/primitive type/void/[])的有关信息
方法名 | 功能说明 |
---|---|
static ClassforName(String name) | 返回指定类名name的Class对象 |
getName() | 返回此Class对象所表示的实体(类,接口,数组类或void)的名称 |
Class getSuperClass() | 返回当前Class对象的父类的Class对象 |
Class[] interfaces() | 获取当前Class对象的接口 |
Class getClassLoader() | 返回该类的类加载器 |
Class []getConstructors() | 返回一个包含某些Constructor对象的数组 |
Method getMothed(String name,Class.. T) | 返回一个Method对象,此对象的形参类型为paramType |
Object newInstance() | 调用缺省构造函数,返回Class对象的一个实例 |
Field[] getDeclaredFields() | 返回Field对象的一个数组 |
//获得Class对象的几种方式
//1. 通过对象获得
Person person1 = new Person();
Class c1 = person1.getClass();
//2. forname方法获得
Class c2 = Class.forname("com.zhou3.reflection.Person")
//3. 通过类名.class获得
Class c3 = Person.class;
//4. 基本内置类型的包装类都有一个Type属性
Class c4 = Integer.TYPE;
//那些类有Class
public static void main(String[] args){
Class c1 = Object.class; //类
Class c2 = Comparable.class;//接口
Class c3 = String[].class; //一维数组
Class c4 = int[][].class; //二维数组
Class c5 = Ovdrride.class; //注解
Class c6 = ElementType.class;//枚举类型
Class c7 = Integer.class; //基本数据类型
Class c8 = void.class; //void
Class c9 = Class.class; //Class
}
可以对类中的方法或属性进行操作
可以通过关闭安全检测= 属性或方法.setAccessible(true) =这种方式类提高反射的效率
//获取Class对象
Class c1 = Class.forname("com.zhou.reflection.User");
//构造对象
User user = (User)c1.newInstance();//调用了无参构造器
System.out.println(user);
//通过构造器构造对象
Constructor constructor = c1.getDeclaredConstructor(String.class,int.class,int.class);
User user2 = (User)construct.newInstance("反射",01,18)
//通过反射调用普通方法
Method setName = c1.getDeclaredMethod("setName",String.class);
//激活
//(对象,"方法的值")
setName.invoke(user1,"小明");
//不能直接操作私有属性,我们需要关闭程序的安全检测才可以直接操作私有属性,属性或方法.setAccessible(true)
name.setAccessible(true);
原文:https://www.cnblogs.com/zhoushuaiyi/p/14592648.html