Day 11 狂神说Java基础笔记(注解与反射01-17)

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-小结
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值