什么是反射
是在运行状态中,必须先要获取一个类的字节码文件对象。就能解刨出它的所有属性和方法
反射常用类
-
Class类—可获取类和类的成员信息
获取Class类对象的方式
第一种方式
//对象.getClass
Student stu=new Student();
Class clazz=stu.getClass();
第二种方式
//类.class
clazz= Student.class;
clazz=String.class;
第三种方式
//Class.forName()
clazz=Class.forName("java.lang.String");
反射的有点和缺点
优点:
1.提高了Java程序的灵活性和扩展性,降低了耦合性,提高自适应能力
2.允许程序创建和控制任何类的对象,无需提前硬编码目标类
缺点:
1.性能问题
2.代码维护问题
public void Test(Object o) throws Exception {
//获取类对象
Class clazz = o.getClass();
//获取构造方法
Constructor[] constructors = clazz.getConstructors();
//获取一个无参构造方法
Constructor constructor = clazz.getConstructor();
//获取带参构造方法
Constructor constructor1 = clazz.getConstructor(String.class, int.class);
//获取方法(获取所有的公开的方法,包括从父类继承过来的)
Method[] method = clazz.getMethods();
//获取类中所有的方法,包括私有的,不包括继承的方法
Method[] declaredMethods = clazz.getDeclaredMethods();
}
利用 注解 和 反射做一个简单的工具类
注解接口
@Target({ElementType.FIELD,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Value {
//注解的默认属性名,我们在使用注解的时候如果想直接写值,
// 而不需要写name,那么代表当前注解中必须有一个value()的方法
// String value();
}
在定义属性的时候可以直接用注解给属性做标记
package com.zzh.utils;
/*
//不懂说话,只可以对你笑
*/
public class User {
@Value
private String name;
@Value
private String userName;
@Value
private String password;
@Value
private String email;
@Vvl("11")
private long phone;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public long getPhone() {
return phone;
}
public void setPhone(long phone) {
this.phone = phone;
}
}
工具类 判断
public class AnnotationUtil {
public static void fillData(Object o)throws Exception{
//获取类
Class clazz = o.getClass();
//获取类的所有声明的字段
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
//打开私有访问
field.setAccessible(true);
//判断变量上是否有注解
Value annotation = field.getAnnotation(Value.class);
//判断注解
if(annotation != null){
//获取属性值
Object value = field.get(o);
String val = (String) value;
if(val == null || val.trim().equals("")){
//获取属性
field.getName();
System.out.println(field.getName()+"错误");
continue;
}
System.out.println(value);
}
Vvl In = field.getAnnotation(Vvl.class);
if(In != null){
//获取属性值
Object value = field.get(o);
Long vv = (Long)value;
if(vv==null ||vv.toString().trim().equals("")){
System.out.println("手机号不能为空");
continue;
}
if(vv.toString().length()>11||vv.toString().length()<11){
System.out.println("手机号输入错误");
continue;
}
System.out.println(vv);
}
}
}
}
后续.