概述
01,02-内置注解
@override
@Deprecated
@SuppressWarnings
03-元注解
@Target 描述注解的使用范围
@Retention 需要在什么级别保存该注释信息,用于描述注解的生命周期(SOURCE->CLASS<RUNTIME)
@Documented 说明该注解将被包含在javadoc中
@Inherited 说明子类可以继承父类中的该注解
04-自定义注解
package Annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
public class Test02 {
//注解可以显示赋值,如果没有默认值,我们就必须给注解赋值
@MyAnnotation(name="zhengyao")//无顺序
public void Test01() {//不加void会报错,为什么
// TODO Auto-generated constructor stub
}
@Myannotation1("")//只有value时可以不写名字
private void Test03() {
}
}
@Target (value= {ElementType.METHOD,ElementType.TYPE})
@Retention(value=RetentionPolicy.RUNTIME)
@Documented
@Inherited
@interface MyAnnotation{//不能加public,一个类里只能有一个公共方法
//注解的参数:参数类型+参数名
String name() default "";
int age() default 0;
int id() default -1;//如果默认值为-1,代表不存在,
String[] schools() default {"BUPT","ZRSB"};
}
@interface Myannotation1{
String value();//一个的时候默认value()
}
05-反射机制
动态语言:在运行时可以改变其结构的语言,例如新的函数、对象、甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化,如,Object-C、C#、JavaScript、PHP、Python
静态语言:运行时结构不可变的语言,Java、C、C++
Java准动态
06-获得反射对象
判断一个对象所属哪个类,构造对象,判断类的成员变量和方法,获取泛型信息,调用对象的成员变量和方法,处理注解,生成动态代理
反射是解释性操作,慢于执行性操作,时间差几十倍
package Annotation;
public class Test01 {
public static void main(String[] args) {
//通过反射获取类的反射对象
try {
Class class1=Class.forName("Annotation.User");
System.out.println(class1);
Class class2=Class.forName("Annotation.User");
System.out.println(class2.hashCode());
Class class3=Class.forName("Annotation.User");
System.out.println(class3.hashCode());
Class class4=Class.forName("Annotation.User");
System.out.println(class4.hashCode());
//一个类在内存中只有一个Class对象
//一个类被加载后,类的整个结构都会被封装在Class对象中
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//实体类 pojo entity
class User{
private String nameString;
private int id;
private int age;
public User() {
// TODO Auto-generated constructor stub
}
public User(String nameString, int id, int age) {
super();
this.nameString = nameString;
this.id = id;
this.age = age;
}
public String getNameString() {
return nameString;
}
public void setNameString(String nameString) {
this.nameString = nameString;
}
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;
}
@Override
public String toString() {
return "User [nameString=" + nameString + ", id=" + id + ", age=" + age + "]";
}
}
07-得到Class的几种方式
08-所有类型的Class对象
09-类加载内存分析
10-类的加载器
11-注解和反射11:类加载器*
加载-链接-初始化
双亲委派机制:保障安全性
12-获取类运行时结构
getField()—只能找到public属性
getDeclaredField()—所有属性
getMethod()–获得本类及父类的全部public方法
getDeclaredMethod()–获得本类的全部方法
13-动态创建对象执行方法
package Annotation;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class test13 {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException, NoSuchFieldException {
//获得Class对象
Class c1 =Class.forName("Annotation.User");
//构造一个对象
User user =(User) c1.newInstance();//本质上是调用了类的无参
System.out.println(user);
//通过构造器创建对象
Constructor constructor= c1.getDeclaredConstructor(String.class,int.class,int.class);
User object=(User)constructor.newInstance("zr",2,27);
System.out.println(object);
//通过反射获取一个方法
Method setName=c1.getDeclaredMethod("setNameString", String.class);
setName.invoke(object, "sb");//激活的意思
System.out.println(object.getNameString());
//通过反射操作属性
Field name =c1.getDeclaredField("nameString");
name.setAccessible(true);//不能直接访问私有属性
name.set(object, "dog");
System.out.println(object.getNameString());
}
}
14-性能对比分析
普通方式-9:反射方式-5699:关闭检测-1959 ms
15-获取泛型信息
泛型擦除机制?确保数据的安全性和免去强制类型转换的问题?编译完成,泛型信息擦除
ParameterizedType:表示一种参数化类型,比如Collection*
genericArrayType:表示一种元素类型是参数化类型或者类型变量的数组类型
Typevariable:是各种类型变量的公共父接口
WildcardType:代表一种通配符类型表达式
16-获取注解信息
ORM(Object Relationship Mapping)
package Annotation;
import java.lang.annotation.Annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
//练习反射操作注解
public class Test15 {
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, SecurityException {
Class c1 =Class.forName("Annotation.Student");//定位到类
//通过反射获得注解
Annotation[] annotations=c1.getAnnotations();
for (Annotation annotation : annotations) {
System.out.println(annotation);
//System.out.println(((TableZ) annotation).value());
}
//获得注解的value的值
TableZ annotationTableZ=(TableZ)c1.getAnnotation(TableZ.class);
System.out.println(annotationTableZ.value());
//获得类指定的注解
Field fieldZ=c1.getDeclaredField("nameString");
//fieldZ.setAccessible(true);
FieldZ annFieldZ=fieldZ.getAnnotation(FieldZ.class);
System.out.println(annFieldZ.columnName());
System.out.println(annFieldZ.length());
System.out.println(annFieldZ.type());
}
}
@TableZ("db_student")
class Student{
@FieldZ(columnName="db_id",type="int",length=10)
private int id;
@FieldZ(columnName="db_age",type="int",length=10)
private int age;
@FieldZ(columnName="db_nameString",type="varchar",length=10)
private String nameString;
public Student() {
super();
}
public Student(int id, int age, String nameString) {
super();
this.id = id;
this.age = age;
this.nameString = nameString;
}
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 getNameString() {
return nameString;
}
public void setNameString(String nameString) {
this.nameString = nameString;
}
@Override
public String toString() {
return "Student [id=" + id + ", age=" + age + ", nameString=" + nameString + "]";
}
}
//类名的注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@interface TableZ{
String value();
}
//属性的注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@interface FieldZ{
String columnName();
String type();
int length();
}
17-小结
最后
以上就是无辜服饰为你收集整理的Day 11 狂神说Java基础笔记(注解与反射01-17)的全部内容,希望文章能够帮你解决Day 11 狂神说Java基础笔记(注解与反射01-17)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复