java.lang.Class应用

记录:478

场景:使用java.lang.Class,获取指定类的Class对象、获取类的构造函数、获取类的方法、获取类的属性、获取类的注解以及类的其它信息。在Java反射机制中发挥重要作用。

版本:JDK 1.8,Spring Boot 2.6.3。

1.基础

1.1Class类

在JDK的java.lang.Class中对Class的官方说明如下:

Instances of the class Class represent classes and interfaces in a running Java application. An enum is a kind of class and an annotation is a kind of interface. Every array also belongs to a class that is reflected as a Class object that is shared by all arrays with the same element type and number of dimensions. The primitive Java types (boolean, byte, char, short, int, long, float, and double), and the keyword void are also represented as Class objects.

Class has no public constructor. Instead Class objects are constructed automatically by the Java Virtual Machine as classes are loaded and by calls to the defineClass method in the class loader.

1.2Java 反射机制

Java 反射机制是在运行状态中,对于任意一个类,都能够获得这个类的所有属性和方法,对于任意一个对象都能够调用它的任意一个属性和方法。这种在运行时动态的获取信息以及动态调用对象的方法的功能称为Java 的反射机制。

2.创建Class对象(三种方式)

// HashMap类全限定名称
String clzName = "java.util.HashMap";
Class<?> clazz01 = Class.forName(clzName);
Class<?> clazz02 = Class.forName(clzName, true, HashMap.class.getClassLoader());
Class<?> clazz03 = java.util.HashMap.class;
System.out.println("Class对象clazz01: " + clazz01.getName());
System.out.println("Class对象clazz02: " + clazz02.getName());
System.out.println("Class对象clazz03: " + clazz03.getName());

3.创建实例对象

HashMap<String, String> hashMap = (HashMap<String, String>) clazz01.newInstance();
System.out.println("判断一个对象是否是实例: " + clazz01.isInstance(hashMap));

4.获取类的构造函数

//1获取类的全部构造方法
Constructor<?>[] constructor01 = ThreadPoolExecutor.class.getConstructors();
//2获取类的指定构造方法(根据构造方法入参类型)
Constructor<?> constructor02 = ThreadPoolExecutor.class.getConstructor(int.class, int.class, long.class, TimeUnit.class, BlockingQueue.class);
StringBuilder sb01 = new StringBuilder();
Arrays.asList(constructor01).forEach(item -> {
    sb01.append(item.getName() + ",");
});
System.out.println("获取类的全部构造方法列表: " + sb01.toString());
System.out.println("获取类的指定构造方法: " + constructor02.getName());

5.获取类的方法

//1获取类的全部方法列表
Method[] method01 = ThreadPoolExecutor.class.getMethods();
//2获取类的指定方法,无入参数
Method method02 = ThreadPoolExecutor.class.getMethod("isTerminated", null);
//3获取类的指定方法,有入参数
Method method03 = ThreadPoolExecutor.class.getMethod("execute", Runnable.class);
StringBuilder sb02 = new StringBuilder();
Arrays.asList(method01).forEach(item -> {
    sb02.append(item.getName() + ",");
});
System.out.println("获取类的全部方法列表: " + sb02.toString());
System.out.println("获取类的指定名称方法: " + method02.getName());
System.out.println("获取类的指定名称方法: " + method03.getName());

6.获取类的属性

//1获取类的全部属性列表
Field[] field01 = CityVO.class.getFields();
//2获取类的指定属性
Field field02 = CityVO.class.getField("cityNo");
StringBuilder sb03 = new StringBuilder();
Arrays.asList(field01).forEach(item -> {
    sb03.append(item.getName() + ",");
});
System.out.println("获取类的全部属性列表: " + sb03.toString());
System.out.println("获取类的指定名称属性: " + field02.getName());

7.获取类的注解

//1获取类全部注解列表
Annotation[] ano01 = WorkImpl.class.getAnnotations();
//2获取类的指定注解
CityAno ano02 = WorkImpl.class.getAnnotation(CityAno.class);
StringBuilder sb04 = new StringBuilder();
Arrays.asList(ano01).forEach(item -> {
    sb04.append(item.annotationType() + ",");
});
System.out.println("获取类全部注解: " + sb04.toString());
System.out.println("获取类注解属性,code=" + ano02.code() + ",value=" + ano02.value());
System.out.println("CityAno是否是注解: " + CityAno.class.isAnnotation());

8.类的其它信息

Class<?> clz02 = Class.forName("java.util.HashMap");
//1获取类的ClassLoader
ClassLoader clzLoader = clz02.getClassLoader();
//2判断类是否是可分配对象
boolean b01 = clz02.isAssignableFrom(HashMap.class);
//3判断类是否是接口
boolean b02 = clz02.isInterface();
//4判断类是否是数组
boolean b03 = clz02.isArray();
//5判断类是否是基本类型
boolean b04 = long.class.isPrimitive();
//6判断类是否是注解
boolean b05 = long.class.isAnnotation();
//7判断类是否是局部类
boolean  b06 = AbstractMap.SimpleEntry.class.isLocalClass();
//8判断类是否是成员类
boolean  b07 = AbstractMap.SimpleEntry.class.isMemberClass();
//9获取参数类型
TypeVariable<? extends Class<?>>[] tv01 = clz02.getTypeParameters();
//10获取继承的类和继承类的类型
Class clz = clz02.getSuperclass();
Type ty = clz02.getGenericSuperclass();
//11获取包信息
Package pkg = clz02.getPackage();
//12获取实现的接口和实现的接口类型
Class<?>[] ifs = clz02.getInterfaces();
Type[] ifsType = clz02.getGenericInterfaces();
//13类名称
String name01 = clz02.getSimpleName();
String name02 = clz02.getTypeName();
String name03 = clz02.getCanonicalName();
//14判断是否是枚举类型
boolean enum01 = clz02.isEnum();
Object[] enum02 = JDBCType.class.getEnumConstants();
//15获取内部类
Class<?>[] cls03 = clz02.getClasses();
//16获取Modifier
int mod = clz02.getModifiers();

9.辅助类

9.1CityVO

public class CityVO {
    public String cityNo;
    public String cityName;
    public String population;
}

9.2CityAno

@Retention(RetentionPolicy.RUNTIME)
public @interface CityAno {
    //城市编码
    String code();
    //城市名称
    String value() default "";
}

9.3DistrictAno

@Retention(RetentionPolicy.RUNTIME)
public @interface DistrictAno {
    //区编码
    String code();
    //区名称
    String value() default "";
}

9.4Work

public interface Work {
    String getData();
}

9.5WorkImpl

@CityAno(code = "Xiamen",value = "厦门")
@DistrictAno(code = "Haicang",value = "海沧")
public class WorkImpl implements Work{

    @Override
    public String getData() {
        return "厦门天气很好";
    }
}

以上,感谢。

2024年2月26日

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值