Java学习:反射(一)

[b]动态语言[/b]:程序运行时,允许改变程序结构或变量类型的语言。从这点来说,Perl、Python、Ruby是动态语言,C++、Java、C#不是动态语言。

[b]JAVA反射[/b]:运行时加载、探知、使用编译期间完全未知的classes,即Java程序可以加载一个运行时才得知名称的 Class,获悉其完整构造(但不包括Methods定义),并生成其对象实体、或对其Fields设值、或唤起其Methods。

[b]主要元素[/b]:
Class:类名对应类对象
Field:类或接口中定义的所有可访问的公共字段(可理解为公共成员变量)
Modifier:类或接口的修饰符(如public、protected、private、final、static、abstract、interface)
Method:类或接口中定义的方法
Package:该类所在的包

[b]例子[/b]:
(1) 定义一个类Man,成员变量有public、protected、private类型
public class Man implements Person {
private String m_name;
protected String m_nickName;
public String m_chineseName;
public Man(String name) {
this.m_name = name;
}

public String getName() {
return this.m_name;
}
public void setName(String name) {
this.m_name = name;
}
}


(2) Main方法
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
//获取类对象
Class clazz = Class.forName("com.reflect.example.Man");
//类中的方法
System.out.println("Methods:");
Method[] methods = clazz.getMethods();
for (int i = 0; i < methods.length; i++) {
System.out.println(" " + methods[i].toString());
}

//类中的字段
System.out.println("Fields:");
Field[] fileds = clazz.getFields();
for (int i = 0; i < fileds.length; i++) {
System.out.println(" " + fileds[i].toString());
}

//类中的修饰符
System.out.println("Modifiers:" + clazz.getModifiers());
} catch (Exception e) {
// TODO: handle exception
}
}


(3)输出
Methods:
public java.lang.String com.reflect.example.Man.getName()
public void com.reflect.example.Man.setName(java.lang.String)
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
public java.lang.String java.lang.Object.toString()
Fields:
public java.lang.String com.reflect.example.Man.m_chineseName
Modifiers:1

(4)小结
--Class::getMethods()得到的是该类的所有方法(包括从父类继承下来的),需要得到某一个方法可以使用Class::getMethod(String name, Class... parameterTypes)
--Class::getFields()得到的是public类型的字段,得不到protected、private类型的,但可以使用Class::getDeclaredFields() 来得到所有类型的,或者使用Class::getDeclaredField(String name) 来取得某个方法
--Class::getModifiers()得到类定义的类型:public(1)、private(2)、protected(4)、static(8)、interface(512)等,以int型数表示


[b]构造函数[/b]:
String className = "com.reflect.example.Man";
//类对象.
Class clazz = Class.forName(className);
//获得名字为className的构造对象,构造函数有参数时,把参数的类数组作
//为getConstructor的参数
Constructor constructor = clazz.getConstructor(new Class[]{String.class});
//通过构造对象获得名字为className的实例.
Person person = (Person)constructor.newInstance(new Object[]{"Jack"});

[b]唤起Method[/b]:
(1) 调用:person.setName();
(2) 使用Method的invoke方式
Method method = clazz.getMethod("setName", new Class[]{String.class});
//要调用方法的对象person作为第一个参数,而要传递给所要调用方法的参数集作为第二个参数
method.invoke(person, new Object[]{"Joke"});
方式(1)、(2)实现同样的功能。但方式(2)能够在运行期间唤起所需要调用的方法,使得动态调用方法更灵活,在一些优秀的框架和动态代理中常常使用这种方式。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值