Java使用反射实例化类,得到域的值,调用该类的方法

获得类和实例

我们以汽车类型为例:


public class Car {
	private  String name = "111";
	public double salary = 12.0;

	public String getName() {
		return name;
	}

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

	public double getSalary() {
		return salary;
	}

	public void setSalary(double salary) {
		this.salary = salary;
	}

	@Override
	public String toString() {
		return "Car [name=" + name + ", salary=" + salary + "]";
	}
	
	
	
}

然后利用反射获得类和他的实例:

public static void main(String[] args)  {
	try {
		Class car = Class.forName("Car");
		Car car2 = (Car) car.newInstance();
		System.out.println(car);
		System.out.println(car2);			
	} catch (Exception e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
}

输出为:

class Car
Car [name=111, salary=12.0]

然后获得遍历获得他的所有域和值:

public static void main(String[] args)  {
	try {
		Class car = Class.forName("Car");		
		Field[] f =  car.getDeclaredFields();
			for(Field fie : f) {
				fie.setAccessible(true);
				System.out.println(fie.toString()+" : "+fie.get(car.newInstance()));
			}		
	} catch (Exception e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
}

输出为:

private java.lang.String Car.name : 111
public double Car.salary : 12.0

接下来我们尝试执行他的私有和公有方法:

public static void main(String[] args)  {
	try {
		Class car = Class.forName("Car");
		Car car2 = (Car) car.newInstance();
		Method method = car.getDeclaredMethod("setName",String.class);		
		method.setAccessible(true);
		//name值改变成5555
		method.invoke(car2,"5555");
				
		Method method2 = car.getDeclaredMethod("getName");		
		System.out.println(method2.invoke(car2));
	} catch (Exception e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
}

输出为:

5555

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值