??一: Class对象包含了某个类型(类,接口等)的所有信息,我们可以通过它得到类中方法,字段,继承的基类,实现的接口等信息;
* ============================(一)======================================== *
2.1获取方法和字段信息 * 方法和字段信息都是通过类表示的,这些类位于java.lang.reflect包中,方法又分为构造方法和普通的方法,对应构造方法(也称为构造器) * 的类是Constructor,对应方法的类是Method,对应字段的类是Field * Class类中得到构造器的方法如下(以下方法签名省略了异常声明) * (2.1)public Constructor<?>[] getConstructors() * 返回所有公共的构造器,如果没有"公共构造器",这返回长度为0的数组; * (2.2)public Constructor<T> getConstructor(Class<?> 。。。 parameterTypes) * 通过指定的构造器参数获得匹配的"公共构造器"; * (2.3)public Constructor<?>[] getDeclaredConstructors() * 返回所有声明的构造器,包括public,protected,default, private构造器; * (2.4)public Constructor<T> 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<T> ... 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<? 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 {
}
/**
* 获取基类和接口信息:
* 有时知道某个类的基类或者实现的接口也是有用的,可以用于判断某个对象是否可以进行安全的类型转换
* 在Class类中有如下的两个方法,可以分别获取某基类或者实现接口
* public Class<? super T> getSupperClass()
* 获取基类
* public Class<?>[] getInterfaces()
* 获取实现的接口方法
*/
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;
/**
* 枚举类:
* 如果Class对象表示的是枚举类型,那么可以调用getEnumConstants 方法来得到所有的枚举值,
* 该方法签名如下所示:
* public T[] getEnumConstants()
*/
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<Week> 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
(四) 获取泛型相关信息
/**
* 泛型:
* 获取泛型信息:
* 类或接口的泛型信息通过Class对象也是可以得到的.为了更好地表示泛型类型,Java5在java.lang.reflect
* 包中定义了一个新的接口Type,将其作为所有类型的公共超级接口,同时让Class类实现了该接口,从Type接口派生了四个
* 子接口,专门用于泛型类型,这四个接口如下所示:
* (1)TypeVariable<D>: 描述类型变量,例如: T
* (2)WildcardType: 表示通配符类型表达式,例如: ? ,? extends Number ,或者 ? super Integer;
* (3)ParameterizedType:表示参数化类型,例如: Collection<String>
* (4)GenericArrayType: 表示其元素类型为参数化类型或类型变量的数组类型,即泛型数组,例如: T[]
* Class中定义的与泛型相关的方法,有如下三个:
* public Type getGenericSuperclass()
* 这是java 5新增的方法,获取基类,如果基类是参数化类型,这会保留类型参数。
* public Type[] getGenericInterfaces()
* 这是JAVA5新增的方法,获取所有类型的接口,如果接口是参数化类型,这会保留类型参数
* public TypeVariable<Class<T>>[] getTypeParameters()
* 这是Java5新增的方法,以申明的顺序返回所有的类型变量.
*/
===========================================================================
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<T> {
void call(T args);
}
class MyCallBack implements Functor<Object> {
@Override
public void call(Object args) {
System.out.println("泛型(args):" + args);
}
}
class CallbackTest {
public static <T> T callback(ArrayList<T> list, Functor<? super T> fun) {
for (T each : list) {
fun.call(each); // 调用方法
}
return list.get(0); // 返回列表第一个元素
}
}
输出结果:
[MyCallBack类的泛型信息]
基类:
class java.lang.Object
|