Class类中的getEnclosingXX、getDeclaredXX

一、getEnclosingXX

getEnclosingClass():该类是在那个类中定义的, 比如直接定义的内部类或匿名内部类

getEnclosingConstructor():该类是在哪个构造函数中定义的,比如构造方法中定义的匿名内部类

getEnclosingMethod():该类是在哪个方法中定义的,比如方法中定义的匿名内部类

实例

package reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

/**
 * @author zhangquanit
 */
public class Outer {

	public Outer() {
		// 构造方法中的匿名内部类
		InnerClass innerClass = new InnerClass() {
			@Override
			public void fun() {
				getEnclosing(this.getClass());
				/**
				 * enclosingClass=class reflect.Outer
				 * enclosingConstructor=public reflect.Outer()
				 * enclosingMethod=null
				 */
			}
		};
		innerClass.fun();
	}

	// 匿名内部类
	static InnerClass innerClass = new InnerClass() {
		public void fun() {
			getEnclosing(this.getClass());
			/**
			 * enclosingClass=class reflect.Outer 
			 * enclosingConstructor=null
			 * enclosingMethod=null
			 */
		};
	};

	public static void test() {
		// 方法中的匿名内部类
		InnerClass innerClass = new InnerClass() {
			@Override
			public void fun() {
				getEnclosing(this.getClass());
				/**
				 * enclosingClass=class reflect.Outer 
				 * enclosingConstructor=null
				 * enclosingMethod=public static void reflect.Outer.test()
				 */

			}
		};
		innerClass.fun();
	}

	// 内部类
	public static class InnerClass {
		public InnerClass() {

		}

		public void fun() {

		}
	}

	public static void main(String[] args) {
		System.out.println("------内部类------");
		getEnclosing(InnerClass.class);
		
		System.out.println("------匿名内部类------");
		innerClass.fun();
		
		System.out.println("------方法中的匿名内部类------");
		Outer.test();
		
		System.out.println("------构造函数中的匿名内部类------");
		new Outer();
	
	}

	/**
	 * getEnclosingClass:该类是在那个类中定义的, 比如直接定义的内部类或匿名内部类
	 * getEnclosingConstructor:该类是在哪个构造函数中定义的,比如构造方法中定义的匿名内部类
	 * getEnclosingMethod:该类是在哪个方法中定义的,比如方法中定义的匿名内部类
	 * 
	 * @param cls
	 */
	private static void getEnclosing(Class cls) {
		Class enclosingClass = cls.getEnclosingClass();
		Constructor enclosingConstructor = cls.getEnclosingConstructor();
		Method enclosingMethod = cls.getEnclosingMethod();
		System.out.println("enclosingClass=" + enclosingClass);
		System.out.println("enclosingConstructor=" + enclosingConstructor);
		System.out.println("enclosingMethod=" + enclosingMethod);

	}

	private static void getDecalared() {

	}

}


二、getDeclaringClass

getDeclaringClass :获取当前类定义所在的类.

package reflect;
import java.util.Arrays;

/**
 * @author zhangquanit
 */
public class Outer {

	// 内部类
	public static class InnerClass {
		public InnerClass() {

		}

		public void fun() {

		}
	}

	// 内部接口
	public interface InnerInterface {

	}
	
 public static void main(String[] args) {

	Class<?> declaringClass = InnerClass.class.getDeclaringClass();
	System.out.println("InnerClass定义所在类为:"+declaringClass);//class reflect.Outer
	
	declaringClass =InnerInterface.class.getDeclaringClass();
	System.out.println("InnerInterface定义所在类为:"+declaringClass);//class reflect.Outer
 } 

}

三、getDeclaredXX

获取当前类中的成员。比如当前类中定义的内部类、构造函数、成员变量、方法。

// 1.获取当前类中的所有类、接口、枚举、注解类等。 (不包括继承的)
Class<?>[] declaredClasses = Outer.class.getDeclaredClasses();
System.out.println(Arrays.toString(declaredClasses));
// 打印 [class reflect.Outer$InnerClass, interface reflect.Outer$InnerInterface]

// 2.当前类上直接使用的注解 (不包括继承的)
Annotation[] declaredAnnotations = Outer.class.getDeclaredAnnotations();
System.out.println(Arrays.toString(declaredAnnotations));
// 打印 [@reflect.MyAnnotation(intValue=0)]

// 3.当前类中的所有构造函数 (不包括继承的)
Constructor<?>[] declaredConstructors = Outer.class.getDeclaredConstructors();
System.out.println(Arrays.toString(declaredConstructors));
// 打印 [public reflect.Outer(int), public reflect.Outer()]

// 4.当前类中的所有成员变量 (不包括继承的)
Field[] declaredFields = Outer.class.getDeclaredFields();
//		Outer.class.getDeclaredField(name)
System.out.println(Arrays.toString(declaredFields));

// 5.当前类中的所有方法 (不包括继承的)
Method[] declaredMethods = Outer.class.getDeclaredMethods();
//		Outer.class.getDeclaredMethod(name, parameterTypes)
System.out.println(Arrays.toString(declaredMethods));




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值