注解分类和说明点
注解:可对程序做解释可被其他程序读取
元注解:@Target:表明注解的使用范围,@Retention:表示要在什么级别保存注解信息,@Document,@Inherited
自定义注解:@interface +注解名
在自定义注解内部可以定义多个属性,如果要使用自定义注解,则必须给注解内部的属性赋值。
通过反射可以读取到private修饰的属性
反射相关的主要API:
java.lang.Class
java.lang.reflect.Method:代表类的方法
java.lang.reflect.Filed:代表类的成员变量
java.lang.reflect.Constructor:代表类的构造器
通过反射获取类的Class对象:
##一个类在内存中只有一个Class对象,一个类被加载后,类的整个结构都会被封装在Class对象中
Class c1=Class.forName("com.kuang.reflection.User)
Class c2=person.getClass() //通过Person类的实例对象person 获得Person类对应的class实例
Class c3=Student.class//直接通过类名获得对应的class实例
Class c4=Integer.TYPE //基本内置包装类都有一个TYPR属性
Class c5=c1.getSuperclass(); //获得对象c1的父类的class实例
所有类型的class实例
通过反射获取类的运行时结构(属性,方法,构造器)
Field[] fields=c1.getFileds();//找到全部public属性 fields=c1.getDelcaredDield();//找到全部属性 Method[] methods=c1.getMethods();//找到全部public方法 Method[] methods=c1.getDeclaredMethods(); Constructor[] constructors=c1.getConstructors();//找到全部public构造器 Constructor[] constructors=c1.getDeclaredConstructors();
通过反射创建对象方式一(通过class实例)
Class c1=Class.forName("com.kuang.reflection.User)//class实例
User user=(User)c1.newInstance();//class实例创建一个object对象,并强转
通过反射创建对象方式二(通过构造器)
Constructor constructor=c1.getDeclaredConstructor(String.class,int.class,int.class)//没有参数则是调用无参构造器
User user2=(User)constructor.newInstance("lian",01,18);
通过反射调用对象方法
User user3=(User)c1.newInstance();
Method setName=c1.getDelcaredMethod("setName",String.class)
setName.invoke(user3,"连");//激活,传(对象名,属性值)
user3.getName()
通过反射操作属性
User user4=(User)c1.newInstance();
//要操作哪个属性,需定义
Field name=c1.getDelcaredField("name");
name.setAccessible(true); //因为不能操作私有属性,所以设置为true需要关闭安全检查开关
//通过反射重新设置属性的值~~
name.set(user4,"连2");
@tableLian("db_student")
class Student{
@FieldLian(columnName="db_id",type="int",length=10)
int id;
//关于id的setter和getter省略
}
自定义两个注解:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy_RunTIME)
@interface FieldLian{
String columnName();
String type();
int length(); //固定写法,加括号
}
==========================
@Target(ElementType.TYPE)
@Retention(RetentionPolicy_RunTIME)
@interface tableLian{
String value(); //固定写法,加括号
}