Annotation的作用:
Annotation的格式
Annotation的作用
@Target:用来描述注解的使用范围@Retention:表示需要在什么级别保存该注释信息,用来描述注解的生命周期(SOURCE@Documented:说明该注解将被包含在javadoc中@Inherited:说明子类可以继承父类中的该注解@Target({ElementType.TYPE,ElementType.FIELD})
@Retention(value = RetentionPolicy.RUNTIME)
@interface myAnnotation{
//注解的参数:参数类型+参数名();
String name() default "";
int age() default 0;
}
动态语言
静态语言
Reflection(反射)是JAVA被视为动态语言的关键,反射机制允许程序在执行期间借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及其方法
加载完类之后,在堆内存的方法区中就产生了一个Class类型对象(一个类只有一个Class对象),这个对象就包含了完整的类的结构信息,我们可以通过这个对象看到类的结构,这个对象就像一面镜子,透过这个镜子看到类的结构,我们形象地称之为反射
class:代表一个类reflect.Method:代表类的方法reflect.Field:代表类的成员变量reflect.Constructor:代表类的构造器[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VBJc3574-1658386243721)(./image/class.png)]
try {
Class<?> aClass = Class.forName("core.page.FIFO");//泛型不确定
System.out.println(aClass);
Class FIFO = core.page.FIFO.class;
FIFO fifo = new FIFO();
FIFO = fifo.getClass();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
//三种方式
() 方法的过程,类构造器() 方法是由编译器自动收集类中所有类变量的复制动作和静态代码块中的语句合并产生的(类构造器是构造类信息的,不是构造该类对象的构造器)() 方法在多线程环境中被正确加载和同步 @Test
public void test(){
/**
* 1.加载到内存,会产生一个class对象
* 2.链接,链接结束后 m = 0
* 3.初始化,执行()方法
* {
* System.out.println("现在正在执行类的静态初始化");
* m = 300;
* m = 100;//这两步是会被合并的
* }
*/
A a = new A();
System.out.println(A.m);
}
class A{
static {
System.out.println("现在正在执行类的静态初始化");
m = 300;
}
static int m = 100;
public A(){
System.out.println("执行无参构造方法");
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DXsIHYiw-1658386243722)(./image/类加载器.png)]
//获得系统类加载器
ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
//系统类的父类加载器,也就是扩展加载器
ClassLoader parent = systemClassLoader.getParent();
//扩展类加载器的父类加载器-->根加载器(c/c++)
ClassLoader parent1 = parent.getParent();
//这里会输出null,无法直接获取
ClassLoader classLoader = Class.forName("java.lang.Object").getClassLoader();
//核心类是由根加载器加载的,因此无法获取
//如何获得系统类加载器可以加载的路径
System.out.println(System.getProperty("java.class.path"));
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pnQO3yo7-1658386243723)(./image/双亲委派机制.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P0hCgSbz-1658386243724)(./image/sqwp2.png)]
Field、Method、Constructor、Superclass、Interface、Annotation @Test
public void test() throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException {
Class<?> c1 = Class.forName("core.page.FIFO");
System.out.println(c1.getName()); //包名+类名
System.out.println(c1.getSimpleName()); //类名
System.out.println(c1.getFields()); //获取所有字段,只能获取到public的属性
System.out.println(c1.getDeclaredFields());//可以获取全部的字段属性
System.out.println(c1.getField("int"));//通过字段名获取,只能获取public
System.out.println(c1.getDeclaredField("int"));//可以获取任意一个字段名
System.out.println(c1.getMethod("test",null));//同理,以及父类的方法也都会输出,限于public
System.out.println(c1.getMethods());//同理
System.out.println(c1.getDeclaredMethod("test"));//只有本类的方法
System.out.println(c1.getDeclaredMethods());
c1.getConstructor();//获取构造器
c1.getDeclaredConstructors();
}
//通过构造器来创建实例
Class<?> c1 = Class.forName("core.page.FIFO");
Constructor constructor = c1.getDeclaredConstructor();
FIFO fifo = (FIFO)constructor.newInstance();
//通过反射调用普通方法
Method method = c1.getDeclaredMethod("sim", int.class);
//invoke(激活该方法):(对象,"方法的值")
method.invoke(fifo,4);
//通过反射操作属性
Field num = c1.getDeclaredField("num");
//(要操作的对象,设置的值),注意如果是private的话默认是不能修改的,可以关闭权限检查
num.setAccessible(true);
num.set(fifo,50);
Object invoke(Ovject obj,Object... arg)
Object对应原方法的返回值,若原方法无返回值,此时返回null
若原方法为静态方法,则obj可以为null
若原方法形参列表为空,则Object[] args为null
setAccessible()
Method和Field、Constructor对象都有此方法
其作用是启动和禁用范文安全检查的开关
参数值为true则指示反射的对象在使用时应该取消JAVA语言访问检查
提高反射的效率,如果代码中必须用反射,则该句代码需要被频繁地调用
使得原本无法访问的私有成员也可以被访问
import org.junit.Test;
import java.lang.annotation.*;
public class ORM {
public static void main(String[] args) throws ClassNotFoundException {
Class c1 = Class.forName("student");
Annotation[] annotations = c1.getAnnotations();
for (int i = 0; i < annotations.length; i++) {
System.out.println(annotations[i]);
}
Table table = (Table)c1.getAnnotation(Table.class);
System.out.println(table.value());
}
}
@Table("db_student")
class student{
@Field(colName = "db_id",type = "int",length = 10)
private int id;
@Field(colName = "db_age",type = "int",length = 10)
private int age;
@Field(colName = "db_name",type = "int",length = 10)
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
//创建一个注解
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@interface Table{
//给一个表名
String value();
}
//属性的注解
@Target(ElementType.FIELD )
@Retention(RetentionPolicy.RUNTIME)
@interface Field{
String colName();
String type();
int length();
}