栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Class类获取Contructor,Method,Field,接口,基类等的常用API(二)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Class类获取Contructor,Method,Field,接口,基类等的常用API(二)

  一: Class对象包含了某个类型(类,接口等)的所有信息,我们可以通过它得到类中方法,字段,继承的基类,实现的接口等信息; * ================================================(一)========================================================= * 2.1获取方法和字段信息 * 方法和字段信息都是通过类表示的,这些类位于java.lang.reflect包中,方法又分为构造方法和普通的方法,对应构造方法(也称为构造器) * 的类是Constructor,对应方法的类是Method,对应字段的类是Field * Class类中得到构造器的方法如下(以下方法签名省略了异常声明) * (2.1)public Constructor[] getConstructors() * 返回所有公共的构造器,如果没有"公共构造器",这返回长度为0的数组; * (2.2)public Constructor getConstructor(Class 。。。 parameterTypes) * 通过指定的构造器参数获得匹配的"公共构造器"; * (2.3)public Constructor[] getDeclaredConstructors() * 返回所有声明的构造器,包括public,protected,default, private构造器; * (2.4)public Constructor getDeclaredConstructor(Class ... parameterTypes) * 通过自动的构造器参数获取匹配的构造器 * ==================================================(二)========================================================== * Class中得到Method的方法有: * (2.1.1)public Method[] getMethods() * 返回所有的公共的方法,剥壳从基类继承到的"公共方法" * (2.2.2)public Method getMethod(String name,Class ... parameterTypes) * 根据指定的方法名和方法参数获取匹配的公共方法,参数name 表示方法的名称,parameterTypes是一个表示方法参数的Class对象数组,以方法形参声明的顺序。 * (2.3.3)public Method[] getDeclaredMethods() * 返回所有声明的方法,包括public ,private,default和protected方法,但是不包括继承的方法 * (2.4.4)public Method getDeclaredMethod(String name,Class ... parameterTypes) * 根据指定的方法名称和方法参数获取匹配的方法,参数name表示方法的名称,parameterTypes是一个表示方法参数的Class对象数组,以方法行参声明的顺序 * =============================================(三)==================================================== * Class类中得到字段的方法 * (2.1.1.1)public Field[] getFields() * 返回所有公共的字段 * (2.2.2.2)public Field getField(String name) * 返回指定名字的公共字段 * (2.3.3.3)public Field[] getDeclaredFields() * 返回所有声明的字段,包括public,protected,default和private字段,但不包括继承的字段 * (2.4.4.4)public Field getDeclaredField(String name) * 返回指定名字的声明的字段

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 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 {

    @Override
    public void call(Object args) {
        System.out.println("泛型(args):" + args);
    }
}

class CallbackTest {
    public static  T callback(ArrayList list, Functor fun) {
        for (T each : list) {
            fun.call(each); // 调用方法
        }
        return list.get(0); // 返回列表第一个元素
    }
}
 

输出结果:

[MyCallBack类的泛型信息]
基类:
class java.lang.Object

转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号