18.8.31 上午 第30天上课
反射大致总结
反射机制
1.反射的概念及作用
2.反射机制常用的类和方法
a.如何获取Class对象
方式1:调用getClass()方法
Userinfo user = new Userinfo();
Class clazz = user.getClass();
方式2:类名.class
Class clazz = Userinfo.class;
方式3:调用Class中的静态方法
Class.forName("cn.zzsxt.entity.Userinfo");
b.获取属性的方法
Field[] clazz.getFields();//获取使用public修饰的属性
Field clazz.getField(String fieldName);获取指定的名称的属性
Field[] clazz.getDeclaredFields():获取所有声明的属性
Field clazz.getDeclaredField(String fieldName):获取声明的指定名称的属性
c.获取方法
Method[] clazz.getMethods();//获取所有的方法,包含从父类继承的方法
Method clazz.getMethod(String methodName,Object... params):获取指定名称的方法
Method[] clazz.getDeclaredMethods();//获取所有自己声明的方法
Method clazz.getDeclaredMethod(String methodName,Object... params);//获取自己声明的指定名称方法
d.获取构造方法
clazz.getConstructor()//获取无参构造方法
clazz.getConstructor(Object... param)//获取有参构造方法
3.如何调用方法和访问属性private int userId;
java.lang.reflect.Field类:代表属性
getModfiers():获取修饰符 1:public 2:private 4:protected 0:默认
getType():获取属性的类型
getName():获取属性的名称
setAcessible(boolean flag):是否禁用安全检查
set(String fieldName,Object value):为指定属性赋值的方法
get(String fieldName):获取属性的值
java.lang.reflect.Method类:成员方法(public void show(){})
getModfiers():获取修饰符 1:public 2:private 4:protected 0:默认
getReturnType():获取返回值类型
getName():获取方法名
getParemeterTypes():获取参数列表
invoke(Object obj,Object...params):回调目标对象obj的方法
4.如何提高反射的效率
setAcessible(boolean flag):是否禁用安全检查
5.如何使用反射操作泛型(了解)
6.JDK中常用注解
@Override:重写的注解(要求重写的方法必须满足重写的规则),只能声明在方法的上面。
@Deprecated:已过时,能声明在方法,属性,变量,构造方法等上面
@SuppressWarnings:压制警告,生声明在SuppressWarnings
7.自定义注解
public @interface 注解名称{
}
元注解:标识注解的注解。
@Target:指定注解标识位置。
ElementType.Type:类,接口,枚举等类型
ElementType.METHOD:方法
ElementType.FIELD:属性
ElementType.CONSTRUCTOR:构造方法
ElementType.PARAMETER:方法的参数
ElementType.LOCAL_VARIABLE:局部变量
ElementType.PACKAGE:包
@Retention:指定注解的作用域范围
RetentionPolicy.SOURCE:源代码
RetentionPolicy.CLASS:编译时
RetentionPolicy.RUNTIME:运行时,可以通过反射机制读取信息
为注解指定参数:参数的类型 参数的名称() default 参数的默认值;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
String name() default "";
int age() default 0;
String[] school() default {};
}
public class TestMyAnnotation {
@MyAnnotation
public void test() {
}
@MyAnnotation(name="zhangsan")
public void test2() {
}
@MyAnnotation(name="zhangsan",age=123)
public void test3() {
}
@MyAnnotation(name="zhangsan",age=123,school= {"北京大学","郑州大学"})
public void test4() {
}
}
8.使用反射读取注解信息
@Target(ElementType.TYPE)//类,接口,枚举
@Retention(RetentionPolicy.RUNTIME)//反射读取注解信息
public @interface SxtTable {
String value();//参数
}
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface SxtColumn {
//参数
String name();//列名
String type();//类型
int length();//长度
}
@SxtTable("tb_student")
public class Student {
@SxtColumn(name="id",type="int",length=10)
private int stuId;
@SxtColumn(name="name",type="varchar",length=20)
private String stuName;
@SxtColumn(name="age",type="int",length=10)
private int stuAge;
public int getStuId() {
return stuId;
}
public void setStuId(int stuId) {
this.stuId = stuId;
}
public String getStuName() {
return stuName;
}
public void setStuName(String stuName) {
this.stuName = stuName;
}
public int getStuAge() {
return stuAge;
}
public void setStuAge(int stuAge) {
this.stuAge = stuAge;
}
}
public class TestAnnotation {
public static void test() throws Exception{
Class clazz = Class.forName("cn.zzsxt.entity.Student");
//获取类上的注解信息
// Annotation[] anns= clazz.getDeclaredAnnotations();
// for (Annotation annotation : anns) {
// System.out.println(annotation);
// }
//获取指定类型的注解
SxtTable sxtTable=(SxtTable)clazz.getDeclaredAnnotation(SxtTable.class);
System.out.println(sxtTable.value());//获取value参数的值
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
String fieldName = field.getName();
System.out.println("属性名称:"+fieldName);
SxtColumn sxtColumn =(SxtColumn)field.getAnnotation(SxtColumn.class);
System.out.println(sxtColumn.name()+"\t"+sxtColumn.type()+"\t"+sxtColumn.length());
}
}
public static void main(String[] args) {
try {
test();
} catch (Exception e) {
e.printStackTrace();
}
}
}