[b]java的反射机制[/b]
关键词:反射
先让我们看看java中的反射机制所能实现的功能:
一:对于任意一个类,都能够知道这个类的所有属性和方法
1: 在运行时判断任意一个对象所属的类;
2:在运行时构造任意一个类的对象;
3:在运行时判断任意一个类所具有的成员变量和方法;
二:对于任意一个对象,都能够调用它的任意一个方法
4:在运行时调用任意一个对象的方法;
5:生成动态代理。
这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
下面我们以一个简单的实例来讲解java的反射机制;
1:其中测试类1主要是为大家展示如可能过一个对象去获得与之相关的一系列信息。
2:而测试类2主要是展示如何通过反射机制实现在对象上调用方法。
//这是共同的接口
public interface IVehicle {
public void startMe();//启动
public int forward(int dins);//前进
//有多少油
public int getEnergy();
}
//这是实现了该接口的一个类
public class BMW implements IVehicle{
public static final String company="宝马公司";
public int energy;//能量
public BMW(){
this.energy = 10;
}
public BMW(int engery){
this.energy = engery;
}
//启动
public void startMe(){
System.out.println("BMW启动...");
}
//前进
public int forward(int dins){
energy -= dins/100;
System.out.println("BWM前进"+dins);
return energy;
}
//有多少能量
public int getEnergy(){
return this.energy;
}
}
//测试类1
public class ReflectionText {
public static void main(String args[]){
BMW b = new BMW();
//叛断对象所属的类型
if(b instanceof BMW){
System.out.println("是BMW类型");
}
if(b instanceof IVehicle){
System.out.println("是IVehicle类型");
}
/**
* 提取类的详细信息
*/
Class c = b.getClass();
Class cd = BMW.class;
System.out.println("BMW.class="+cd.getName());
String className = c.getName();
System.out.println("类的名字是:"+className);
//得到类中的方法对象数组
java.lang.reflect.Method[] methods = c.getMethods();
ReflectionText.printMethodInfo(methods);
//得到类定义的构造器对象数组
java.lang.reflect.Constructor[] cons = c.getConstructors();
//得到类定义的属性对象数组
java.lang.reflect.Field[] fields = c.getFields();
//ReflectionText.printFileInfo(fields);
//得到类的直接父类对象
Class superClass = c.getSuperclass();
//ReflectionText.printSuper(superClass);
//得到类所有实现的接口类对象数组
Class[] interfaces = c.getInterfaces();
//ReflectionText.printInterface(interfaces);
}
/**
*提取属性的详细信息
*/
private static void printFileInfo(java.lang.reflect.Field[] fields){
System.out.println("共有属性:"+fields.length);
for(java.lang.reflect.Field field : fields){
System.out.println("属性的名字是:"+field.getName());
System.out.println("属性的类型是:"+field.getType());
//得到属性的访问限定符
int mType = field.getModifiers();
//叛断是何种限定符
if(java.lang.reflect.Modifier.isPublic(mType)){
System.out.println("isPublic");
}
if(java.lang.reflect.Modifier.isPrivate(mType)){
System.out.println("isPrivate");
}
if(java.lang.reflect.Modifier.isProtected(mType)){
System.out.println("isProtected");
}
if(java.lang.reflect.Modifier.isFinal(mType)){
System.out.println("isFinal");
}
if(java.lang.reflect.Modifier.isAbstract(mType)){
System.out.println("isAbstract");
}
}
}
/**
* 得到所有接口名字
*/
private static void printInterface(Class[] interfaces){
for(Class c :interfaces){
System.out.println("接口名:"+c.getName());
Class[] cs = c.getInterfaces();
printInterface(cs);
}
}
/**
* 输出所有父类名字
*/
private static void printSuper(Class superClass){
System.out.println("接口名:"+superClass.getSuperclass());
Class ss = superClass.getSuperclass();
if(null != ss){
printSuper(ss);
}
}
/**
* 提取方法详细信息
*/
private static void printMethodInfo(java.lang.reflect.Method[] methods){
for(java.lang.reflect.Method method : methods){
int t = method.getModifiers();
System.out.println("限定符是:"+t);
String name = method.getName();
System.out.println("方法名是是:"+name);
Class returnType = method.getReturnType();
System.out.println("反回值是:"+returnType);
//参类类型数组
Class ps[] = method.getParameterTypes();
// for(Class p : ps){
// System.out.println("参数名是:"+p.getName());
// }
Class es[] = method.getExceptionTypes();
}
}
/**
* 打印构造器信息
*/
private static void printConstructorInfo(java.lang.reflect.Constructor[] cons){
}
}
//测试类2,主要实现通过反射机制在对象上调用方法
public class text2 {
//动态创建凡是实现了IVehicle接口的类,只要知道你想知类的名字即可
public static IVehicle createIVehicle(String className){
try{
IVehicle v = (IVehicle)Class.forName(className).newInstance();//动态创建对象
return v;
}catch(Exception ef){
ef.printStackTrace();
}
return null;
}
public static void main(String args[]){
//BMW bmw = new BMW();
IVehicle bmw = text2.createIVehicle("BMW");
bmw.startMe();//测试打印
// IVehicle bmw2 = new BMW();
// bmw2.startMe();
// //得到所在的类,该处也可以写成,BMW.Class();
Class destClass = bmw.getClass();
java.lang.reflect.Method[] methods = destClass.getMethods();//得到这个类的所有定义的方法数组
for(java.lang.reflect.Method m : methods){
Class ps[] = methods[1].getParameterTypes();//得到方法参数类型表
text2.invokeTest(bmw, "forward",ps);
break;
}
}
//在对象上调用方法
public static void invokeTest(IVehicle bmw,String destName,Class[] paraType){
try{
//得到所在的类
Class destClass = bmw.getClass();
//查询要调用的类
java.lang.reflect.Method destMethod = destClass.getMethod(destName, paraType);
if(null != destMethod){
//调查用方法,传入参数
Object obj = destMethod.invoke(bmw, 300);
System.out.println(destMethod+"调用的结果是"+obj);
}
}catch(Exception ef){
ef.printStackTrace();
}
}
}
以上就是java反射机制的简单用法,最重要需要理解的我觉得是“动态”二字,如果想更好的理解,你可以将其它静态对比。你就会发现,它们的区别在于,可以实验动态创建对象,获取相关的类信息。
分享到:
相关推荐
java反射机制java反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制...
`Class`类在Java反射机制中扮演着核心角色,它是所有Java类的运行时表示。`Class`对象可以由以下几种方式获取: 1. **通过类的`Class`属性获取**:如`String.class`。 2. **通过对象的`getClass()`方法获取**:如`...
Java反射机制允许运行中的程序检查自身,并能直接操作程序的内部属性。这是其他许多编程语言(如Pascal、C或C++)不具备的能力。 **1.1 Reflection的工作机制** 为了展示反射如何工作,我们来看一个简单的例子: ...
### Java的反射机制及其实际应用 #### 一、引言 ...总之,Java反射机制是一项强大的工具,它能够在运行时动态地获取和操作类的信息。然而,应该谨慎使用反射,避免滥用造成不必要的性能损失或安全风险。
Java反射机制在JDK 1.1版本中就已经引入,但在JDK 1.5之后得到了进一步增强和完善,增加了泛型支持等功能,使得反射更加安全和强大。 #### 三、Java反射机制的核心概念与应用 1. **核心概念** - **Class对象**:...
Java的反射机制与动态代理是Java编程中两个非常重要的高级特性,它们在许多实际场景中发挥着关键作用,如框架开发、插件系统、元数据处理等。下面将详细讲解这两个概念及其应用。 首先,Java的反射机制允许我们在...
### Java反射机制详解 #### 一、反射机制是什么 反射机制是Java编程语言的一个核心特性,它允许程序在运行时动态地获取类的信息,并且能够动态地创建对象和调用对象的方法。简单来说,反射机制使得Java程序可以...
反射机制的核心是`Class`类,它代表了Java中的每一个类型。通过`Class.forName()`方法,我们可以根据类名获取`Class`对象。一旦有了`Class`对象,我们就可以实例化对象,调用构造器,以及获取类的信息,如类名、...
在JAVA反射机制中,Class类和Field类、Method类、Constructor类是最重要的三个类,它们提供了访问类、字段、方法和构造函数的能力。 在获取某个对象的属性时,我们可以使用getField方法,例如: ```java public ...
java反射机制源码java反射机制源码java反射机制源码
### 反射实例—JAVA反射机制 #### 一、反射概念及原理 反射在计算机科学领域,特别是程序设计中,是指程序有能力访问、检测和修改其自身的结构和行为。这一概念最早由Smith于1982年提出,并迅速应用于各种编程语言...
### Java反射机制总结 #### 反射的概念与起源 反射的概念最早由Smith于1982年提出,指的是程序能够访问、检测并修改其自身状态或行为的能力。这一概念的提出迅速引起了计算机科学领域的广泛关注,并在之后的研究中...
Java 反射机制是 Java 语言中的一个重要特性,它允许程序在运行时动态地获取类的信息(如类名、属性、方法等)并调用对象的方法,甚至修改对象的状态。这一机制极大地增强了 Java 程序的灵活性和可扩展性,尤其是在...
Java反射机制是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。这个特性使得Java具有了高度的动态性和灵活性。在这个“利用java反射机制的建议计算器源码”中...
Java反射机制是Java语言中一个强大的功能,它允许程序在运行时检查和修改其自身的结构和行为。通过Java反射机制,我们可以在运行时获取类的信息,包括类的成员变量、方法、构造方法等,并可以动态地调用这些成员变量...
### Java反射机制详解 #### 一、什么是Java的反射机制 Java反射机制是Java语言的一种重要特性,使得Java成为了一种动态性很强的语言。通过反射,可以在程序运行时获取类的信息,包括类名、父类、接口、字段、方法...
Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时获取和操作任何已知名称的类的内部信息。这一机制使得Java具备了一定的动态性,虽然在传统的分类中Java被视为静态类型语言。通过反射,开发者可以在...