反射是在运行状态获取任何一个已知名称的class的内部信息
我们可以通过以下方式获取class
/**
* 通过类名点class获取
*/
Class<User> userClass = User.class;
/**
* 通过包路径加类名获取
*/
try {
Class<?> user1 = Class.forName("com.User");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
/**
* 通过实例获取
*/
User user=new User();
Class<? extends User> aClass = user.getClass();
获取class中信息的方式
//获取完整类名
System.out.println("getName:"+aClass.getName());
//获取所有属性,不包括私有的
for (Field field:aClass.getFields()) {
System.out.println("getFields:"+field);
}
//获取所有属性,包括私有的
for (Field field:aClass.getDeclaredFields()) {
System.out.println("getDeclaredFields:"+field);
}
//获取所有方法,包括继承对象的方法,不包括私有的
for (Method method:aClass.getMethods()) {
System.out.println("getMethods():"+method);
}
//获取所有方法,包括私有的
for (Method method:aClass.getDeclaredMethods()) {
System.out.println("getDeclaredMethods():"+method);
}
//获取指定方法,第一个参数是方法名称,第二个参数是方法内的参数类型如:getPublic(String name)
try {
Method getPublic = aClass.getMethod("getPublic", String.class);
System.out.println(getPublic);
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
//获取所有构造方法,不包括私有的
for (Constructor constructor:aClass.getConstructors()) {
System.out.println("getConstructors():"+constructor);
}
//通过参数类型获取指定构造方法
try {
Constructor<? extends User> constructor = aClass.getConstructor(String.class, String.class);
System.out.println("getConstructors(Type):"+constructor);
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
//获取指定的注解
System.out.println(aClass.getAnnotation(Logger.class));
//获取类声明的全部注解
for (Annotation annotation:aClass.getAnnotations()) {
System.out.println(annotation);
}
//获取类声明的注解
for (Annotation annotation:aClass.getDeclaredAnnotations()) {
System.out.println(annotation);
}
运行结果





本文深入探讨了Java中的反射机制,通过示例展示了如何在运行时获取类的内部信息,包括获取类名、字段、方法、构造器以及注解等。详细阐述了`Class.forName()`、`Class.getMethod()`等关键方法的使用,为理解及操作Java对象提供了实用指南。
4870

被折叠的 条评论
为什么被折叠?



