`
BBjava
  • 浏览: 119966 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

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

阅读更多
这个例子好似来自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开发技术大全(500个源代码).

    listConstructors.java 利用反射机制获取构造器列表 listFields.java 利用反射机制获取成员属性列表 listMethods.java 利用反射机制获取成员方法列表 loadClass.java 动态装载一个类 Shape.java 一个用于测试的...

    Java开发技术大全 电子版

    9.6利用反射获取运行时类信息293 9.6.1使用isInstance()方法判断所属类294 9.6.2获取成员方法信息295 9.6.3获取构造方法信息296 9.6.4获取类的成员属性297 9.6.5根据方法的名称来执行方法299 9.6.6创建新的...

    \java超强笔记(超级经典)

    解析注释:利用反射 1、Class.forName() 2、getMethod 3、判断是否有注释 4、getAnnotation 并发线程: 三个多线程包: java.util.concurrent 包含了常用的多线程工具,是新的多线程工具的主体...

    疯狂JAVA讲义

    5.8.2 利用组合实现复用 156 学生提问:使用组合关系来实现复用时,需要创建两个Animal对象,是不是意味着使用组合关系时系统开销更大? 159 5.9 初始化块 159 5.9.1 使用初始化块 160 5.9.2 初始化块和构造器 ...

    Java经典编程源码基础例程300.zip

    实例078 利用反射重写toString()方法 119 第8章 字符串与包装类 121 实例079 将数字格式化为货币字符串 122 实例080 货币金额大写格式 123 实例081 String类格式化当前日期 125 实例082 字符串大小写转换 1

    javaSE代码实例

    8.5.8 通过重写扩展父类方法的功能 143 8.5.9 替代性原理 144 8.6 方法的重载 145 8.6.1 方法重载的规则 145 8.6.2 重载方法的匹配 145 8.6.3 重写与重载的区别 149 8.7 final与继承 149 8.7.1 最终...

    net学习笔记及其他代码应用

    Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。 接口(interface)是抽象类的变体。在接口中,所有方法...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    实例160 利用反射重写toString()方法 208 实例161 反射与动态代理 209 7.3 常见的未检查型异常 210 实例162 算数异常 210 实例163 数组存值异常 211 实例164 数组下标越界异常 212 实例165 空指针异常 213 7.4 常见...

    JAVA面试题最全集

    修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中不被...

    Java学习笔记-个人整理的

    {2.4}父类对象的方法调用}{51}{section.2.4} {2.5}封装}{52}{section.2.5} {2.6}多态}{53}{section.2.6} {2.7}Sample code}{54}{section.2.7} {2.8}框架中移动的小球}{59}{section.2.8} {2.9}抽象与接口}{59}{...

Global site tag (gtag.js) - Google Analytics