`

利用反射获取父类,接口信息

阅读更多
这个例子好似来自tij-4,(太久没更新博客了,不记得了)。
这个例子主要是用来说明,运行时能获取的被实现的接口,被继承的类的信息。
在实际开发中是一个蛮常用的手段,比如在框架中要检查某个类是否实现了某一接口。

package org.iteye.bbjava.runtimeinformation;




class Toy {

	/**
	 * It's a contructor of Toy class,it could be used contructing an object of
	 * Toy at runtime.
	 * */
	public Toy() {
		// TODO Auto-generated constructor stub
	}

	public Toy(int i) {

	}
}

interface HasBatteries {

}

interface Waterproof {

}

interface Shoots {

}

class FancyToy extends Toy implements HasBatteries, Waterproof, Shoots {
	FancyToy() {
		super(1);
	}
}

public class ToyTest {
	static void printInfo(Class cc) {
		System.out.println("Class name: " + cc.getName() + " is interface?["
				+ cc.isInterface() + "]");
		System.out.println("Simple name: " + cc.getSimpleName());
		System.out.println("Canonical name: " + cc.getCanonicalName());
	}

	public static void main(String[] args) {
		Class c = null;
		try {
			c = Class.forName("org.iteye.bbjava.runtimeinformation.FancyToy");

		} catch (Exception e) {
			System.out.println("Can't find FancyToy");
			System.exit(1);
		}
		printInfo(c);

		for (Class face : c.getInterfaces()) {
			printInfo(face);
			Class up = c.getSuperclass();
			Object obj = null;
			try {
				obj = up.newInstance();

			} catch (InstantiationException e) {
				System.out.println("Can't getInstance from up object");
				System.exit(1);
			} catch (IllegalAccessException e) {
				System.out.println("Can't access");
				System.exit(1);
			}
			printInfo(obj.getClass());
		}
	}
}



console info:
引用
Class name: org.iteye.bbjava.runtimeinformation.FancyToy is interface?[false]
Simple name: FancyToy
Canonical name: org.iteye.bbjava.runtimeinformation.FancyToy
Class name: org.iteye.bbjava.runtimeinformation.HasBatteries is interface?[true]
Simple name: HasBatteries
Canonical name: org.iteye.bbjava.runtimeinformation.HasBatteries
Class name: org.iteye.bbjava.runtimeinformation.Toy is interface?[false]
Simple name: Toy
Canonical name: org.iteye.bbjava.runtimeinformation.Toy
Class name: org.iteye.bbjava.runtimeinformation.Waterproof is interface?[true]
Simple name: Waterproof
Canonical name: org.iteye.bbjava.runtimeinformation.Waterproof
Class name: org.iteye.bbjava.runtimeinformation.Toy is interface?[false]
Simple name: Toy
Canonical name: org.iteye.bbjava.runtimeinformation.Toy
Class name: org.iteye.bbjava.runtimeinformation.Shoots is interface?[true]
Simple name: Shoots
Canonical name: org.iteye.bbjava.runtimeinformation.Shoots
Class name: org.iteye.bbjava.runtimeinformation.Toy is interface?[false]
Simple name: Toy
Canonical name: org.iteye.bbjava.runtimeinformation.Toy
分享到:
评论
2 楼 BBjava 2012-11-16  
spiniper 写道
一般利用反射获去获取父类并不是一件常用的功能
判断一个对象是否属于一个类使用 cm instanceof CipherManager这种方式
判断一个类是否为某个类的子类使用 CipherManager.class.isAssignableFrom(SymAsymCipherManager.class);
这种方式。
而且装载类,通常我喜欢用ClassLoader来完成,例如:
cm.getClass().getClassLoader().loadClass("org.spiniper.commons.tool.cipher.SymAsymCipherManager")
当然,这看个人习惯了。

这里主要表达的还是想看看父类、接口里的信息。
instanceof 操作足够胜任了。
1 楼 spiniper 2012-11-16  
一般利用反射获去获取父类并不是一件常用的功能
判断一个对象是否属于一个类使用 cm instanceof CipherManager这种方式
判断一个类是否为某个类的子类使用 CipherManager.class.isAssignableFrom(SymAsymCipherManager.class);
这种方式。
而且装载类,通常我喜欢用ClassLoader来完成,例如:
cm.getClass().getClassLoader().loadClass("org.spiniper.commons.tool.cipher.SymAsymCipherManager")
当然,这看个人习惯了。

相关推荐

    用反射的方式获取父类中的所有属性和方法

    在Java编程语言中,反射(Reflection)是一种强大的工具,它允许程序在运行时检查和操作对象的内部结构,包括类的属性、方法以及构造器。...通过上述步骤,你可以有效地利用反射获取和操作类的父类属性和方法。

    利用反射子父类赋值高效工具类案例extends_setvalue.zip

    在“利用反射子父类赋值高效工具类案例extends_setvalue.zip”中,我们关注的是如何通过反射机制高效地为子类和父类的属性赋值。这种技术在数据持久化和查询结果映射到对象模型时特别有用,可以减少冗余代码并优化IO...

    Java利用反射获取类信息

    `Class`对象的`isInterface()`判断是否为接口,`getGenericSuperclass()`和`getGenericInterfaces()`获取父类或接口的泛型类型。 7. 注解处理: 反射提供了访问注解的能力,`Class`、`Method`、`Field`等都提供了`...

    父类赋值给子类

    可以利用序列化将父类对象转换为字节数组,然后将这个字节数组反序列化为子类对象。这种方法适用于复杂的对象结构,但效率较低,且需要实现 `ISerializable` 接口。 4. **属性映射**: 使用辅助工具(如 ...

    博客《反射(2):泛型相关周边信息获取》对应源码

    源码文件 `<反射(2):泛型相关周边信息获取>` 可能包含示例代码,演示了如何通过反射获取和操作泛型类和接口的实例。通过阅读和学习这段代码,开发者可以更深入地理解反射和泛型的交互,提升在实际项目中的应用...

    博客《 夯实JAVA基本之二 —— 反射(3):类内部信息获取》对应源码

    - 获取父类:`Class<?> superClass = clazz.getSuperclass();` - 获取接口:`Class[] interfaces = clazz.getInterfaces();` - 获取类的所有字段(包括私有字段):`Field[] fields = clazz.getDeclaredFields();` -...

    运用反射得到类中的属性和值

    #### 二、反射获取类中的属性及值 下面,我们将通过具体的代码示例来展示如何使用反射来获取类中的所有属性及其对应的值。 ##### 1. 获取类的信息 首先,我们需要获取目标类的信息。这里使用`getClass()`方法来...

    利用java反射技术实现动态搜索所有字段

    6. **继承关系处理**:如果需要搜索类及其父类的所有字段,需要递归调用`getSuperclass()`来获取父类的Class对象,并重复上述步骤。 7. **泛型处理**:Java的泛型在运行时会被擦除,因此反射无法直接获取到泛型类型...

    java反射机制.pdf

    - **热插拔**:在某些服务器端应用中,利用反射机制动态加载类和接口,实现模块的热插拔。 - **代码生成**:在一些代码生成工具中,利用反射机制动态生成类和方法。 #### 九、总结 Java反射机制是Java语言的重要...

    java反射

    通过上述代码片段的学习,我们可以了解到如何利用反射来处理Java中的泛型问题,这对于实现灵活的代码框架非常有帮助。例如,在Spring框架中就大量使用了反射机制来实现依赖注入等功能。理解并掌握反射机制对于提高...

    使用反射获取和设置对象的值

    1. **获取类信息**:通过`Class<?>`对象,我们可以获取到关于类的所有信息,包括类名、父类、接口、构造器、方法和字段。 2. **创建对象**:反射允许我们在运行时动态创建类的实例,即使我们不知道具体的类名。 3....

    java中的反射机制(内含大量实例)

    - **获取父类**:使用`getSuperclass()`获取父类的Class对象。 - **获取接口**:使用`getInterfaces()`获取实现的接口的Class对象数组。 - **获取类的注解**:使用`getAnnotations()`,`isAnnotationPresent()`等...

    JAVA获取同一路径下所有子类或接口实现类

    - Java反射API允许我们在运行时动态地获取类的信息,包括类名、属性、方法等,并可以创建和操作类的对象。`Class<?>`代表运行时的类信息。 4. **获取类加载器**: - `Thread.currentThread()....

    android系统java反射机制详解

    通过Class对象,我们可以在运行时获取到类的完整信息,包括类名、包名、父类、接口、字段、方法等。反射机制主要涉及三个核心类:Class、Constructor和Method,以及Field。 1. Class类:代表运行时的类信息,可以...

    利用反射实现对象转json格式字符串

    在Java编程中,反射是一种强大的工具,它允许我们在运行时检查和操作类、接口、字段和方法的信息。本文将深入探讨如何使用反射技术将对象转换为JSON格式的字符串。我们将以一个名为`JsonUtils`的Java类为例,该类...

    Java 1.5 反射机制

    一旦有了`Class`对象,我们就可以实例化对象,调用构造器,以及获取类的信息,如类名、父类、接口、字段和方法。 2. 实例化对象 使用`Class`对象的`newInstance()`方法,可以在不明确指定类名的情况下创建对象。但...

    Java反射机制经典案例

    - `Class` 类:它是所有Java类的父类,用于获取类的信息。可以通过`Class.forName("全限定类名")`获取类对象。 - `newInstance()` 方法:通过类对象创建实例,要求类有无参构造器。 - `getConstructors()` 和 `...

    类的反射机制

    通过`isInterface()` 判断类是否为接口,通过`getGenericSuperclass()` 和 `getGenericInterfaces()` 获取父类和接口的泛型信息。 5. **注解处理**: 反射提供了访问类、方法、字段上注解的途径,`getAnnotations()`...

    java反射机制知识点

    - **动态代理**:利用反射和InvocationHandler接口,可以在运行时创建一个代理对象,该代理对象可以代替真实对象执行方法,并在执行前后添加额外的操作。 - **序列化与反序列化**:反射机制可以帮助我们读取和写入...

    玩转反射demo

    1. **运行时类型检查**:通过`Class`对象,你可以获取任何类型的完整信息,包括它的父类、实现的接口以及定义的字段和方法。 2. **动态实例化**:你可以根据类名字符串动态创建对象,无需在编译时就确定类。 3. **...

Global site tag (gtag.js) - Google Analytics