java反射机制应用例子


package fanshe.entity;
/**
* 测试实体
* @author hewei
*
*/
public class Animal {

private String name;
private int age;
public int text;

public Animal(){}
public Animal(String name, int age) {
this.name = name;
this.age = age;
}

public void speak(){
System.out.println("my name is "+this.name+"; i am "+this.age+"years old!");
}
private String chat(String name){
return "I chat with"+name;
}

public String getName() {
return name;
}

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

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

public int getText() {
return text;
}

public void setText(int text) {
this.text = text;
}
}
package fanshe;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

import fanshe.entity.Animal;
/**
* java反射机制 reflection
* 运行时创建类的对象
* 访问其字段、方法
* 测试类
* @author hewei
*
*/
public class Test {

/**
* @param args
*/
public static void main(String[] args) {
try {
Class<?> classType = Class.forName("fanshe.entity.Animal"); //获得Class对象
Method[] ms = classType.getMethods();//获得对象的public方法
for(Method m : ms){
System.out.println("method "+m);
}
Field[] field = classType.getFields(); //获得该class所有声明的field(public)
for(Field f : field){
System.out.println("field "+f);
}
/**
* 创建Animal 对象
*/
Animal animal = (Animal)classType.newInstance();
animal.setAge(12);
animal.setName("小熊猫");
animal.speak();
/**
* 创建 Animal对象 通过带参构造函数
*/
Constructor<?> c = classType.getConstructor(new Class[]{String.class,int.class});
Animal animal2 = (Animal) c.newInstance(new Object[]{"大熊猫",20});
animal2.speak();
/**
* 通过反射访问对象的私有方法
*/
Method chatMethod = classType.getDeclaredMethod("chat", new Class[]{String.class});//通过getDeclareMethod()取得私有方法
chatMethod.setAccessible(true);//設置方法可見性為 true
String returnString =(String) chatMethod.invoke(animal, new Object[]{"小泽玛莉亚"});
System.out.println(returnString);
/**
* 通过反射访问对象私有属性
*/
Field privateF = classType.getDeclaredField("name");//通过getDeclaredField()取得私有字段
privateF.setAccessible(true);//设置属性的可见性为true
privateF.set(animal, "苍井空");
animal.speak();
} catch (Exception e) {
e.printStackTrace();
}
}
}



//运行结果:
method public java.lang.String fanshe.entity.Animal.getName()
method public void fanshe.entity.Animal.setName(java.lang.String)
method public void fanshe.entity.Animal.setAge(int)
method public void fanshe.entity.Animal.speak()
method public int fanshe.entity.Animal.getAge()
method public int fanshe.entity.Animal.getText()
method public void fanshe.entity.Animal.setText(int)
method public final void java.lang.Object.wait() throws java.lang.InterruptedException
method public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
method public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
method public native int java.lang.Object.hashCode()
method public final native java.lang.Class java.lang.Object.getClass()
method public boolean java.lang.Object.equals(java.lang.Object)
method public java.lang.String java.lang.Object.toString()
method public final native void java.lang.Object.notify()
method public final native void java.lang.Object.notifyAll()
field public int fanshe.entity.Animal.text
my name is 小熊猫; i am 12years old!
my name is 大熊猫; i am 20years old!
I chat with小泽玛莉亚
my name is 苍井空; i am 12years old!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值