一: Class对象包含了某个类型(类,接口等)的所有信息,我们可以通过它得到类中方法,字段,继承的基类,实现的接口等信息; * ================================================(一)========================================================= * 2.1获取方法和字段信息 * 方法和字段信息都是通过类表示的,这些类位于java.lang.reflect包中,方法又分为构造方法和普通的方法,对应构造方法(也称为构造器) * 的类是Constructor,对应方法的类是Method,对应字段的类是Field * Class类中得到构造器的方法如下(以下方法签名省略了异常声明) * (2.1)public Constructor>[] getConstructors() * 返回所有公共的构造器,如果没有"公共构造器",这返回长度为0的数组; * (2.2)public Constructor
class ReflectClass {
public int pubField;
protected int proField;
private int priField;
public ReflectClass() {
}
public ReflectClass(int a) {
}
public ReflectClass(int a, int b) {
}
public ReflectClass(int a, int b, int c) {
}
public void pub_method() {
}
protected void pro_method() {
}
void defMethod() {
}
private void priMethod() {
}
public static void staticMethod() {
}
}
interface MyInterface {
float pi = 3.14f;
void fun();
default void defFun() {
}
static void staticFun() {
}
}
public class MyReflectClass {
public static void main(String[] args) {
Class clazz = ReflectClass.class;
// 获取公共的字段
System.out.println("ReflectClass公共的字段");
System.out.println("Fields:");
for(Field field: clazz.getFields()){
System.out.println(field);
}
System.out.println("=============================================");
System.out.println("ReflectClass所有的字段");
for(Field field: clazz.getDeclaredFields()){
System.out.println(field);
}
System.out.println("=============================================");
System.out.println("Constructors:");
for(Constructor constructor: clazz.getConstructors()){
System.out.println(constructor);
}
System.out.println("==============================================");
System.out.println("ReflectClass公共的方法,包括继承的方法");
System.out.println("Methods:");
for(Method method: clazz.getMethods()){
System.out.println(method);
}
System.out.println("========================获得接口中的方法===========================");
System.out.println("interface's Method: ");
clazz = MyInterface.class;
for(Method method: clazz.getMethods()){
System.out.println(method);
}
}
}
测试结果:
ReflectClass公共的字段 Fields: public int org.jy.sso.cas.data.server.reflects.ReflectClass.pubField ============================================= ReflectClass所有的字段 public int org.jy.sso.cas.data.server.reflects.ReflectClass.pubField protected int org.jy.sso.cas.data.server.reflects.ReflectClass.proField private int org.jy.sso.cas.data.server.reflects.ReflectClass.priField ============================================= Constructors: public org.jy.sso.cas.data.server.reflects.ReflectClass(int,int,int) public org.jy.sso.cas.data.server.reflects.ReflectClass(int,int) public org.jy.sso.cas.data.server.reflects.ReflectClass(int) public org.jy.sso.cas.data.server.reflects.ReflectClass() ============================================== ReflectClass公共的方法,包括继承的方法 Methods: public static void org.jy.sso.cas.data.server.reflects.ReflectClass.staticMethod() public void org.jy.sso.cas.data.server.reflects.ReflectClass.pub_method() public final void java.lang.Object.wait() throws java.lang.InterruptedException public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException public boolean java.lang.Object.equals(java.lang.Object) public java.lang.String java.lang.Object.toString() public native int java.lang.Object.hashCode() public final native java.lang.Class java.lang.Object.getClass() public final native void java.lang.Object.notify() public final native void java.lang.Object.notifyAll() ========================获得接口中的方法=========================== interface's Method: public abstract void org.jy.sso.cas.data.server.reflects.MyInterface.fun() public static void org.jy.sso.cas.data.server.reflects.MyInterface.staticFun() public default void org.jy.sso.cas.data.server.reflects.MyInterface.defFun()
(二) 获取基类和接口信息: * 有时知道某个类的基类或者实现的接口也是有用的,可以用于判断某个对象是否可以进行安全的类型转换 * 在Class类中有如下的两个方法,可以分别获取某基类或者实现接口 * public Class super T> getSupperClass() * 获取基类 * public Class>[] getInterfaces() * 获取实现的接口方法
package org.jy.sso.cas.data.server.reflects;
interface A {
}
interface B {
}
class Base {
}
class Derived extends Base implements A, B {
}
public class SuperClassAndInterface {
public static void main(String[] args) {
Class clazz = Derived.class;
Class baseClazz = clazz.getSuperclass();
System.out.println("基类: "+baseClazz);
System.out.println("获取实现的接口:");
Class[] interfaces= clazz.getInterfaces();
for(Class c: interfaces){
System.out.println(c);
}
}
}
输出的结果:
基类: class org.jy.sso.cas.data.server.reflects.Base 获取实现的接口: interface org.jy.sso.cas.data.server.reflects.A interface org.jy.sso.cas.data.server.reflects.B
(三)
枚举类:
如果Class对象表示的是枚举类型,那么可以调用getEnumConstants 方法来得到所有的枚举值, * 该方法签名如下所示: * public T[] getEnumConstants()
package org.jy.sso.cas.data.server.reflects;
public enum Week {
Sunday, Monday, Tuesday, Wednesday,
Thursday, Friday, Saturday;
}
测试与输出结果:
package org.jy.sso.cas.data.server.reflects;
public class EnumInfo {
public static void main(String[] args) {
Class clazz = Week.class;
Week[] weeks = clazz.getEnumConstants(); // 获取枚举的值
for (Week week : weeks) {
System.out.println("枚举Week:" + week);
}
}
}
===================================输出结果=====================================================
枚举Week:Sunday
枚举Week:Monday
枚举Week:Tuesday
枚举Week:Wednesday
枚举Week:Thursday
枚举Week:Friday
枚举Week:Saturday
(四) 获取泛型相关信息
===========================================================================
package org.jy.sso.cas.data.server.type;
import java.lang.reflect.Type;
import java.util.ArrayList;
public class GenericInfo {
public static void main(String[] args) {
System.out.println("[MyCallBack类的泛型信息]");
Class clazz = MyCallBack.class;
Type baseType = clazz.getGenericSuperclass();
System.out.println("基类: ");
System.out.println(baseType);
}
}
// 接口泛型
interface Functor {
void call(T args);
}
class MyCallBack implements Functor
输出结果:
[MyCallBack类的泛型信息] 基类: class java.lang.Object



