`

学习java中的反射(一)

阅读更多

   说明:一下代码是参考网上一份代码,结合自己的分析进行学习的。这篇文章的内容后续会进行相应的修改

   package com.reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.GenericArrayType;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.lang.reflect.TypeVariable;
import java.lang.reflect.WildcardType;

/**

 */
interface GenericInterface {
};

class GenericSuperClass {
};

interface IClassTestA<A, B> extends GenericInterface {
	String printA(A a);
}

interface IClassTestB<A, B> extends GenericInterface {
	String printB(B b);
}

interface IClassTestC extends GenericInterface {
	String printC();
}

class ClassTestC<A, B> extends GenericSuperClass implements IClassTestA<A, B> {
	@Override
	public String printA(A a) {
		System.out.println("this is A:" + a);
		return null;
	}
}

public class ClassTest<A, B> extends ClassTestC<A, B> implements
		IClassTestB<A, B>, IClassTestC {
	private A a;
	private B b;
	private String c;

	private ClassTest() {

	}

	public ClassTest(A a, B b) {
		this.a = a;
		this.b = b;
		System.out.println("constructor :" + a.toString() + b.toString());
	}

	@Override
	public String printB(B b) {
		System.out.println("this is B:" + b);
		return null;
	}

	@SuppressWarnings("unchecked")
	public static void main(String[] args) {
		try {
			Class<ClassTest> classTest = ClassTest.class;
			/** 类所实现的接口 */
			Class[] intf = classTest.getInterfaces();
			System.out.print("类实现的接口:");
			for (Class c : intf) {
				System.out.print(c.toString() + "  ");
			}
			System.out
					.println("\n------------------------------------------------------------------------");

			/**
			 * 取得接口Type[] getGenericInterfaces public Type[]
			 * getGenericInterfaces()返回表示某些接口的 Type,这些接口由此对象所表示的类或接口直接实现。
			 * 如果超接口是参数化类型,则为它返回的 Type
			 * 对象必须准确反映源代码中所使用的实际类型参数。如果以前未曾创建表示每个超接口的参数化类型
			 * ,则创建这个类型。有关参数化类型创建过程的语义,请参阅 ParameterizedType 声明。
			 * 
			 * 如果此对象表示一个类,则返回一个包含这样一些对象的数组,这些对象表示该类实现的所有接口。
			 * 数组中接口对象顺序与此对象所表示的类的声明的 implements 子句中接口名顺序一致。对于数组类,接口 Cloneable 和
			 * Serializable 以该顺序返回。
			 * 
			 * 如果此对象表示一个接口,则该数组包含表示该接口直接扩展的所有接口的对象。数组中接口对象顺序与此对象所表示的接口的声明的
			 * extends 子句中接口名顺序一致。
			 * 
			 * 如果此对象表示一个不实现任何接口的类或接口,则此方法返回一个长度为 0 的数组。
			 * 
			 * 如果此对象表示一个基本类型或 void,则此方法返回一个长度为 0 的数组。
			 * 
			 * 
			 * 返回: 此类所实现的接口的一个数组
			 */
			Type[] types = classTest.getGenericInterfaces();

			System.out.print("Type[] getGenericInterfaces:");
			// IClassTestC不属于以下四种子类
			for (Type type : types) {
				// ParameterizedType 表示参数化类型也就是泛型 ,如 Collection<String>。
				if (type instanceof ParameterizedType) {
					System.out.print("  ParameterizedType:" + type.toString());
					// ParameterizedType:complex.java.lang.IClassTestB<A, B>

					// 取该type的实际类型 Type[] (泛型的实际类型)
					Type[] ts = ((ParameterizedType) type)
							.getActualTypeArguments();
					System.out.print("  ts的长度是:" + ts.length);
					for (Type t : ts) {
						if (t instanceof ParameterizedType) {
							// 循环了--------------------
							System.out.print("ParameterizedType:"
									+ t.toString() + " ");
						}
						// GenericArrayType 表示一种数组类型,其组件类型为参数化类型或类型变量
						if (t instanceof GenericArrayType) {
							System.out
									.print("GenericArrayType:" + t.toString());
						}
						/**
						 * TypeVariable 是各种类型变量的公共高级接口。
						 * 类型变量在反射方法首次需要时创建(在此包中指定)。 如果类型变量 t 由类型(即类、接口或注释类型)T
						 * 引用, 而且 T 由 T 的第 n 个封闭类声明(请参见 JLS 8.1.2) ,那么创建 t
						 * 需要解析(请参见 JVMS 5)T 的第 i 个封闭类,其中 i = 0 到 n(包含)。
						 * 创建某个类型变量决不能导致创建其边界。重复创建类型变量没有效果。
						 * 可以在运行时将多个对象实例化,以表示一个给定的类型变量。
						 * 尽管类型变量仅创建一次,这并不意味着任何缓存实例的要求都表示类型变量。
						 * 不过,表示类型变量的所有实例彼此必须相等 (equal())。
						 * 因此,使用类型变量的用户决不能依靠实现此接口的类实例的身份。
						 */
						// A,B就属于此类型
						if (t instanceof TypeVariable) {
							System.out.print("   TypeVariable:" + t.toString());
						}
					}
				}

				// ####################################
				if (type instanceof GenericArrayType) {
					System.out.print("属于GenericArrayType类型:" + type.toString());
				}
				if (type instanceof TypeVariable) {
					System.out.print("属于TypeVariable类型:" + type.toString());
				}
				if (type instanceof WildcardType) {
					System.out.print("属于WildcardType类型:" + type.toString());
				}
			}

			System.out
					.println("\n--------------------------------------------------------------------------------");
			/** 取得父类Type */
			Type type = classTest.getGenericSuperclass();
			System.out.println("父类的type:" + type.toString());
			System.out
					.println("---------------------------------------------------------------------------------");

			/** ############################################# */
			/** 取得属性 */
			ClassTest ct = new ClassTest();
			// public属性
			Field[] fields = classTest.getFields();
			// 所有声明的属性
			fields = classTest.getDeclaredFields();
			for (Field field : fields) {
				// field.get(ct)为ct对象的各field值
				System.out.println("ct's  " + field.toGenericString() + ":"
						+ field.get(ct));
			}
			System.out
					.println("-----------------------------------------------------------------");
			/** 取得构造方法 */
			// 取得public的构造方法
			Constructor[] constructors = classTest.getConstructors();
			// 取得所有声明的构造方法
			constructors = classTest.getDeclaredConstructors();
			for (Constructor constructor : constructors) {
				// 构造方法的名称
				System.out.println(constructor.getName());
				// 构造方法的 Java 语言修饰符
				System.out.println(constructor.getModifiers());
				Class<?>[] cs = constructor.getParameterTypes();
				for (Class c : cs) {
					System.out.println("constructor.getParameterTypes"
							+ c.toString());
				}
				System.out.println(constructor.toGenericString());
			}

			/** 取得方法 */
			// public方法
			Method[] methods = classTest.getMethods();
			// 所有声明的方法
			methods = classTest.getDeclaredMethods();
			for (Method method : methods) {
				System.out.println(method.toGenericString());
			}
			// 取得某个具体方法
			Method method = classTest.getMethod("getTest", String.class);
			// 调用ct对象的该方法
			method.invoke(ct, "++++++++++++++this getTest");
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	@Override
	public String printC() {
		// TODO Auto-generated method stub
		return "classTest printC()";
	}

	public String getTest(String a) {
		System.out.println(a);
		return "来自classTest getTest(String a)";
	}

	public A getA() {
		return a;
	}

	public void setA(A a) {
		this.a = a;
	}

	public B getB() {
		return b;
	}

	public void setB(B b) {
		this.b = b;
	}

}
 
分享到:
评论

相关推荐

    java例子 java反射

    Java反射是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射机制的核心类是`java.lang.Class`,它代表了类的信息。当我们需要在运行时动态地...

    Java反射机制的使用和学习方法

    Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、对象等的内部信息。这一机制对于理解和实现高级框架、动态代理、元数据处理等场景至关重要。以下是对Java反射机制的详细说明:...

    Java反射学习.pdf

    Java 反射是 Java 程序设计语言的特征之一,它允许运行中的 Java 程序对自身进行检查,或者说 "自审 ",并能直接操作程序的内部属性。Java 反射的能力在实际应用中非常有价值,例如,使用它能获得 Java 类中各成员的...

    Java中的反射机制

    Java反射机制允许运行中的程序检查自身,并能直接操作程序的内部属性。这是其他许多编程语言(如Pascal、C或C++)不具备的能力。 **1.1 Reflection的工作机制** 为了展示反射如何工作,我们来看一个简单的例子: ...

    Java反射机制学习(二)

    在"Java反射机制学习(二)"这篇博文中,作者可能详细解释了以上这些概念,并通过`BaseTest.java`和`Student.java`这两个示例文件进行了实例演示。`BaseTest.java`可能包含了一组基础的反射操作,而`Student.java`...

    java面试题--反射机制

    ### Java反射机制详解 #### 一、引言 在Java面试中,经常会出现与反射...以上内容不仅解释了Java反射机制的相关知识点,还通过示例代码进行了实践演示,希望能够帮助你在Java面试中更好地理解和运用这一重要特性。

    java注解和反射的个人学习笔记

    java注解和反射的个人学习笔记

    Java反射机制的学习

    Java反射机制是Java编程语言中的一项核心特性,它允许程序在运行时动态地获取类的信息并进行操作。这使得Java能够在编译后仍然能够灵活地处理类和对象,增强了代码的动态性。在Android应用开发中,反射机制尤其重要...

    java反射-英文版反射规范

    虽然Java反射提供了一种非常灵活的方式来操作类和对象,但在实际应用中也需要注意几个关键点: ##### 1. **安全性** - 使用反射可能会导致安全漏洞,因为可以访问到私有成员。 - 在设计应用程序时应限制反射的...

    Java反射经典实例

    Java反射是Java编程语言中的一个强大特性,它允许运行时的程序访问并操作类、接口、字段和方法等信息,即使这些信息在编译时并未明确知晓。在Java中,反射通常通过`java.lang.Class`类和相关的API来实现。本实例将...

    JAVA反射机制的入门代码

    Java反射机制是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。这个特性使得Java具有了高度的灵活性和动态性,尤其是在处理元数据、创建对象、调用私有方法...

    java中的反射reflect

    总的来说,Java反射提供了一种强大的能力,使得程序可以在运行时检查和修改自身的行为。然而,这也增加了代码的复杂性,可能导致安全问题和性能下降,因此在实际开发中应谨慎使用。学习和理解反射原理,可以帮助我们...

    java学习——java中的反射学习笔记.rar_java 反射

    Java反射是Java编程语言中的一种强大机制,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射是通过java.lang.Class类和java.lang.reflect包中的类来实现的。本篇笔记将深入探讨...

    java中反射知识总结

    2. **类对象** - 在Java中,每个类都有一个对应的Class对象,它是Java反射的入口。我们可以通过Class对象来实例化对象、获取类的构造器、方法和字段信息。例如,`Class&lt;?&gt; clazz = Class.forName("全限定类名");` 这...

    java反射源代码

    Java反射是Java编程语言中的一个强大特性,它允许在运行时检查类、接口、字段和方法的信息,并且能够在运行时动态地创建对象和调用方法。这个特性使得Java具有高度的灵活性,尤其在处理框架、插件系统以及元数据驱动...

    北大青鸟java反射机制

    在"北大青鸟java反射机制"的学习资料中,我们将会深入探讨这一核心特性。 首先,我们要理解反射的核心概念:在程序运行时,通过Class对象获取类的信息,包括类名、属性、方法等,并能够动态地创建对象和调用方法。...

    解析并创建XML文件和Java的反射

    5. **Java反射的应用**: - 动态代理:在运行时创建代理类,实现接口并转发方法调用。 - 插件系统:加载未知类并执行其方法。 - 数据持久化框架如Hibernate利用反射操作数据库对象。 - 测试工具如JUnit利用反射...

    java学习笔记(java 反射机制 流 内存管理)

    本笔记主要涵盖了四个核心知识点:Java反射机制、流(I/O流)、内存管理和Java学习的基础。以下是对这些主题的详细阐述: 一、Java反射机制 Java反射机制是Java语言的一个强大特性,允许程序在运行时检查类、接口、...

    JAVA的反射机制与动态代理

    Java的反射机制与动态代理是Java编程中两个非常重要的高级特性,它们在许多实际场景中发挥着关键作用,如框架开发、插件系统、元数据处理等。下面将详细讲解这两个概念及其应用。 首先,Java的反射机制允许我们在...

Global site tag (gtag.js) - Google Analytics