java反射机制的原理

反射的常用类和函数:Java反射机制的实现要借助于4个类:Class,Constructor,Field,Method;其中class代表的是类对象,Constructor-类的构造器对象,Field-类的属性对象,Method-类的方法对象,通过这四个对象我们可以粗略的看到一个类的各个组成部分。其中最核心的就是Class类,它是实现反射的基础,它包含的方法我们在第一部分已经进行了基本的阐述。应用反射时我们最关心的一般是一个类的构造器、属性和方法,下面我们主要介绍Class类中针对这三个元素的方法:

1、得到构造器的方法

Constructor getConstructor(Class[] params) -- 获得使用特殊的参数类型的公共构造函数,

Constructor[] getConstructors() -- 获得类的所有公共构造函数

Constructor getDeclaredConstructor(Class[] params) -- 获得使用特定参数类型的构造函数(与接入级别无关)

Constructor[] getDeclaredConstructors() -- 获得类的所有构造函数(与接入级别无关)

2、获得字段信息的方法

Field getField(String name) -- 获得命名的公共字段

Field[] getFields() -- 获得类的所有公共字段

Field getDeclaredField(String name) -- 获得类声明的命名的字段

Field[] getDeclaredFields() -- 获得类声明的所有字段
3、获得方法信息的方法

Method getMethod(String name, Class[] params) -- 使用特定的参数类型,获得命名的公共方法

Method[] getMethods() -- 获得类的所有公共方法

Method getDeclaredMethod(String name, Class[] params) -- 使用特写的参数类型,获得类声明的命名的方法

Method[] getDeclaredMethods() -- 获得类声明的所有方法

应用反射的基本步骤:

1、获得你想操作的类的Class对象;

方法一:Class c=Class.forName("java.lang.String")

方法二:对于基本数据类型可以用形如Class c=int.class或Class c=Integer.TYPE的语句

方法三:Class c=MyClass.class

2、调用Class中的方法得到你想得到的信息集合,如调用getDeclaredFields()方法得到类的所有属性;

  3、处理第2步中得到的信息,然后进行你想做的实际操作。

  反射实例:

下面我将针对类的构造器、属性和方法分别举三个例子,向大家演示一下反射的应用过程。

1、构造器

步骤为:通过反射机制得到某个类的构造器,然后调用该构造器创建该类的一个实例

import java.lang.reflect.*;
public class ConstructorDemo{
public ConstructorDemo(){ }
public ConstructorDemo(int a, int b){
System.out.println("a="+a+"b="+b);
}

public static void main(String args[]){
try {
Class cls = Class.forName("ConstructorDemo");
Class partypes[] = new Class[2]; partypes[0] = Integer.TYPE;
partypes[1] = Integer.TYPE;
Constructor ct= cls.getConstructor(partypes);
Object arglist[] = new Object[2];
arglist[0] = new Integer(37);
arglist[1] = new Integer(47);
Object retobj = ct.newInstance(arglist);
} catch (Throwable e) {
System.err.println(e); }
}
}

2、属性

步骤为:通过反射机制得到某个类的某个属性,然后改变对应于这个类的某个实例的该属性值

import java.lang.reflect.*;
public class FieldDemo1{
public double d;

public static void main(String args[]){
try {
Class cls = Class.forName("FieldDemo1");
Field fld = cls.getField("d");
FieldDemo1 fobj = new FieldDemo1();
System.out.println("d = " + fobj.d);
fld.setDouble(fobj, 12.34);
System.out.println("d = " + fobj.d);
} catch (Throwable e){
System.err.println(e); }
}
}

3、方法

步骤为:通过反射机制得到某个类的某个方法,然后调用对应于这个类的某个实例的该方法

//通过使用方法的名字调用方法
import java.lang.reflect.*;
public class MethodDemo1{
public int add(int a, int b){
return a + b;
}

public static void main(String args[]){
try {
Class cls = Class.forName("MethodDemo1");
Class partypes[] = new Class[2];
partypes[0] = Integer.TYPE;
partypes[1] = Integer.TYPE;
Method meth = cls.getMethod("add", partypes);
MethodDemo1 methobj = new MethodDemo1();
Object arglist[] = new Object[2];
arglist[0] = new Integer(37);
arglist[1] = new Integer(47);
Object retobj= meth.invoke(methobj, arglist);
Integer retval = (Integer)retobj;
System.out.println(retval.intValue());
} catch (Throwable e) {
System.err.println(e);
}
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值