扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
Java的反射(reflection)机制是运行时获取类的信息(构造函数、属性、方法、注解)。
成都创新互联公司-专业网站定制、快速模板网站建设、高性价比宽城网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式宽城网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖宽城地区。费用合理售后完善,十年实体公司更值得信赖。1.2 反射的作用1.创建类的对象
2.获取类中的属性,并设置属性的值或者获取属性的值
3.获取类中的方法,可以执行方法(包含私有)
4.获取注解信息
1.3 反射的应用1.创建类的对象,比如JSON解析,框架中的某些类等
2.获取或设置属性的内容 Field 比如 JSON解析,JDBC封装等
3.执行方法,可以调用Method invoke 代理模式
1.4 反射的演示全限定类名:类的全称,包含:包名.类名
public static void main(String[] args) {
//反射 Class 字节码 创建Class对象
//Class对象的三种创建方式 1.类名.class 2.对象名.getClass() 3.Class.forName("全限定类名")
//1.创建Class对象
Class clz=Teacher.class;
//2.获取类中的公共属性
Field[] fields1=clz.getFields();//获取类中公共访问修饰符的属性,包含继承
for(Field f:fields1){
System.out.println(f.getName());
}
System.out.println("---------");
//3.获取类中的所有属性,不包含继承的
Field[] fields2=clz.getDeclaredFields();//获取类中的所有属性,不包含父类中的
for(Field f:fields2){
System.out.println(f.getName());
}
System.out.println("---------");
//4.获取公共方法
Method[] methods1=clz.getMethods();//获取类中公共访问修饰符的方法,包含继承
for(Method m:methods1){
System.out.println(m.getName());
}
System.out.println("**********");
//5.获取所有方法,不包含父类的
Method[] methods2=clz.getDeclaredMethods();//获取类中的所有方法,不包含父类中的
for(Method m:methods2){
System.out.println(m.getName());
}
}
1.5 反射总结1.Class对象创建方式
类名.class
2.Class中常用的方法
返回值 | 方法名 | 作用 |
Field[] | getFields | 获取类中公共访问修饰符的属性,包含继承 |
Field[] | getDeclaredFields | 获取类中的所有属性,不包含父类中的 |
Field | getDeclaredField(属性名) | 获取类中的指定的属性 |
Method[] | getMethods | 获取类中公共访问修饰符的方法,包含继承 |
Method[] | getDeclaredMethods | 获取类中的所有方法,不包含父类中的 |
Method | getDeclaredField | 获取类中的指定的方法 |
Object | newInstance | 创建类的对象 |
3.Field的常用方法
getName 获取属性名
setAccessible 设置是否忽略访问修饰符
set() 设置属性的值
4.Method的常用方法
setAccessible 设置是否忽略访问修饰符
invoke 执行方法
1.6 反射实际应用解析字符串
public static void main(String[] args) throws InstantiationException, IllegalAccessException, NoSuchFieldException {
String str="name=贝贝&sex=女&info=自恋!";
//请实现字符串转换为Teacher对象
//1.解析字符串
//2.对象创建 属性赋值
//创建Class对象 -反射
Class clz=Teacher.class;
//创建类的对象
Teacher teacher= (Teacher) clz.newInstance();
//字符串常用方法 解析字符串 切割& 字符串数组
String[] strs1=str.split("&");
System.out.println(Arrays.toString(strs1));
//循环遍历 键值对
for(String s1:strs1){
//切割=
String[] strs2=s1.split("=");
System.out.println(Arrays.toString(strs2));
//反射 获取指定的属性对象
Field field=clz.getDeclaredField(strs2[0]);
if(field!=null){
//设置忽略访问修饰符
field.setAccessible(true);
//赋值
field.set(teacher,strs2[1]);
}
}
System.out.println(teacher);
}
二、注解
2.1 注解是什么Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。可以为代码添加注释
2.2 注解的作用1.解决不一致的问题,比如数据库的字段名和类的属性名不一样,可以实现自定义注解
2.标记,特殊声明,比如自定义令牌校验、参数校验等
2.3 自定义注解的实现定义:
@Target({ElementType.TYPE,ElementType.METHOD,ElementType.FIELD})//设置注解的修饰范围,type 修饰类或接口
@Retention(RetentionPolicy.RUNTIME) //设置注解什么时候被发现,运行时 反射
public @interface MyVersion {
//定义注解中的属性
String version() default "V1.0.0";
}
使用:
@MyVersion(version = "V2.2.2") //使用自定义注解
public class Food {
private int id;
private String name;
private double price;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
}
生效:获取注解的内容
public static void main(String[] args) {
//获取Class对象
Class clz=Food.class;
//获取指定注解对象
MyVersion version= (MyVersion) clz.getDeclaredAnnotation(MyVersion.class);
//获取注解的内容
System.out.println(version.version());
}
三、泛型
3.1 泛型是什么Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。
其实就是解决类型转换的问题,是引用类型的占位符,避免转型
3.2 泛型的作用实现引用类型的占位符,避免类型转换
3.3 泛型的使用定义类或定义方法的使用可以使用泛型,如果类不确定,或者支持多种类型,可以使用泛型
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流