1、Java反射
Java反射详细介绍
通过java语言中的反射机制可以操作字节码文件(可以读和修改字节码文件。)
通过反射机制可以操作代码片段。(class文件。)
1、获取Class的三方式:
- Class.forName(“完整类名带包名”)
- 对象.getClass()
- 任何类型.class
2、常用方法:
- newInstance():实例化对象
- getFields():获取所有公共的public修饰的字段,包括父类的字段
- getDeclaredFields():获取所有本类声明的字段,包括private修饰的,但是不包含父类的字段。
- getField(String name):获取某一个公共的public修饰的字段,包括父类的字段
- getDeclaredField(String name):获取某一个本类声明的字段,包括private修饰的,但是不包含父类的字段。
// 提升反射性能,关闭安全检查
field.setAccessible(true);
值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。值为 false 则指示反射的对象应该实施 Java 语言访问检查;实际上setAccessible是启用和禁用访问安全检查的开关,并不是为true就能访问为false就不能访问 ;
由于JDK的安全检查耗时较多.所以通过setAccessible(true)的方式关闭安全检查就可以达到提升反射速度的目的
// 属性赋值
field.set(object类, object属性值);
public <T> PageRsp<T> getPage( Class<T> cls){
}
举例:类里面有不同字段但是前缀相同,比如前缀是field,后缀是_1,这个字段就是field_1,field_2以此类推,如何用反射获取字段数据?
import java.lang.reflect.Field;
public class ReflectionExample {
public static void main(String[] args) throws IllegalAccessException {
// 创建一个类的实例
MyClass obj = new MyClass();
obj.field_1 = "Value 1";
obj.field_2 = "Value 2";
// 假设还有一个非前缀字段
obj.otherField = "Other Value";
// 使用反射遍历字段
Class<?> clazz = obj.getClass();
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
// 检查字段名称是否以"field"为前缀
if (field.getName().startsWith("field")) {
// 设置字段可访问(如果需要的话)
field.setAccessible(true);
try {
// 获取字段的值
Object value = field.get(obj);
// 打印字段名称和值
System.out.println("Field: " + field.getName() + ", Value: " + value);
} catch (IllegalArgumentException | IllegalAccessException e) {
// 这里通常不会抛出异常,因为我们已经调用了setAccessible(true)
e.printStackTrace();
}
}
}
}
static class MyClass {
public String field_1;
public String field_2;
public String otherField; // 非前缀字段
// 可能还有其他方法和字段...
}
}
2、Java泛型
Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。
泛型的本质是参数化类型,即给类型指定一个参数,然后在使用时再指定此参数具体的值,那样这个类型就可以在使用时决定了。这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法
1、如何使用泛型
泛型有三种使用方式,分别为:泛型类、泛型接口和泛型方法。
// 泛型类
public class 类名 <泛型类型1,...> {
}
// 泛型方法
public static <T,V> String get(T t,V v){
}
public <T,V> String get(T t,V v){
}
// 泛型接口
public interface get<K,V>{ }
在定义泛型类型Pair<T>的时候,也可以使用extends通配符来限定T的类型:
public class Pair<T extends Number> { ... }
2、命名规范
- T:任意类型 type
- E:集合中元素的类型 element
- K:key-value形式 key
- V: key-value形式 value