这个例子好似来自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
分享到:
相关推荐
在Java编程语言中,反射(Reflection)是一种强大的工具,它允许程序在运行时检查和操作对象的内部结构,包括类的属性、方法以及构造器。...通过上述步骤,你可以有效地利用反射获取和操作类的父类属性和方法。
在“利用反射子父类赋值高效工具类案例extends_setvalue.zip”中,我们关注的是如何通过反射机制高效地为子类和父类的属性赋值。这种技术在数据持久化和查询结果映射到对象模型时特别有用,可以减少冗余代码并优化IO...
`Class`对象的`isInterface()`判断是否为接口,`getGenericSuperclass()`和`getGenericInterfaces()`获取父类或接口的泛型类型。 7. 注解处理: 反射提供了访问注解的能力,`Class`、`Method`、`Field`等都提供了`...
可以利用序列化将父类对象转换为字节数组,然后将这个字节数组反序列化为子类对象。这种方法适用于复杂的对象结构,但效率较低,且需要实现 `ISerializable` 接口。 4. **属性映射**: 使用辅助工具(如 ...
源码文件 `<反射(2):泛型相关周边信息获取>` 可能包含示例代码,演示了如何通过反射获取和操作泛型类和接口的实例。通过阅读和学习这段代码,开发者可以更深入地理解反射和泛型的交互,提升在实际项目中的应用...
- 获取父类:`Class<?> superClass = clazz.getSuperclass();` - 获取接口:`Class[] interfaces = clazz.getInterfaces();` - 获取类的所有字段(包括私有字段):`Field[] fields = clazz.getDeclaredFields();` -...
#### 二、反射获取类中的属性及值 下面,我们将通过具体的代码示例来展示如何使用反射来获取类中的所有属性及其对应的值。 ##### 1. 获取类的信息 首先,我们需要获取目标类的信息。这里使用`getClass()`方法来...
6. **继承关系处理**:如果需要搜索类及其父类的所有字段,需要递归调用`getSuperclass()`来获取父类的Class对象,并重复上述步骤。 7. **泛型处理**:Java的泛型在运行时会被擦除,因此反射无法直接获取到泛型类型...
- **热插拔**:在某些服务器端应用中,利用反射机制动态加载类和接口,实现模块的热插拔。 - **代码生成**:在一些代码生成工具中,利用反射机制动态生成类和方法。 #### 九、总结 Java反射机制是Java语言的重要...
通过上述代码片段的学习,我们可以了解到如何利用反射来处理Java中的泛型问题,这对于实现灵活的代码框架非常有帮助。例如,在Spring框架中就大量使用了反射机制来实现依赖注入等功能。理解并掌握反射机制对于提高...
1. **获取类信息**:通过`Class<?>`对象,我们可以获取到关于类的所有信息,包括类名、父类、接口、构造器、方法和字段。 2. **创建对象**:反射允许我们在运行时动态创建类的实例,即使我们不知道具体的类名。 3....
- **获取父类**:使用`getSuperclass()`获取父类的Class对象。 - **获取接口**:使用`getInterfaces()`获取实现的接口的Class对象数组。 - **获取类的注解**:使用`getAnnotations()`,`isAnnotationPresent()`等...
- Java反射API允许我们在运行时动态地获取类的信息,包括类名、属性、方法等,并可以创建和操作类的对象。`Class<?>`代表运行时的类信息。 4. **获取类加载器**: - `Thread.currentThread()....
通过Class对象,我们可以在运行时获取到类的完整信息,包括类名、包名、父类、接口、字段、方法等。反射机制主要涉及三个核心类:Class、Constructor和Method,以及Field。 1. Class类:代表运行时的类信息,可以...
在Java编程中,反射是一种强大的工具,它允许我们在运行时检查和操作类、接口、字段和方法的信息。本文将深入探讨如何使用反射技术将对象转换为JSON格式的字符串。我们将以一个名为`JsonUtils`的Java类为例,该类...
一旦有了`Class`对象,我们就可以实例化对象,调用构造器,以及获取类的信息,如类名、父类、接口、字段和方法。 2. 实例化对象 使用`Class`对象的`newInstance()`方法,可以在不明确指定类名的情况下创建对象。但...
- `Class` 类:它是所有Java类的父类,用于获取类的信息。可以通过`Class.forName("全限定类名")`获取类对象。 - `newInstance()` 方法:通过类对象创建实例,要求类有无参构造器。 - `getConstructors()` 和 `...
通过`isInterface()` 判断类是否为接口,通过`getGenericSuperclass()` 和 `getGenericInterfaces()` 获取父类和接口的泛型信息。 5. **注解处理**: 反射提供了访问类、方法、字段上注解的途径,`getAnnotations()`...
- **动态代理**:利用反射和InvocationHandler接口,可以在运行时创建一个代理对象,该代理对象可以代替真实对象执行方法,并在执行前后添加额外的操作。 - **序列化与反序列化**:反射机制可以帮助我们读取和写入...
1. **运行时类型检查**:通过`Class`对象,你可以获取任何类型的完整信息,包括它的父类、实现的接口以及定义的字段和方法。 2. **动态实例化**:你可以根据类名字符串动态创建对象,无需在编译时就确定类。 3. **...