Java中反射与泛型基本介绍和用法

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
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值