Java中的反射,百度百科这样解释道:在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制。
例如:
package com.bean;
public class Goods {// 商品类
private int id = 1001;
private String name = "泡面";
private double price = 4.5;
public Goods(int id, String name) {
System.out.println("Goods(int id, String name)");
this.id = id;
this.name = name;
}
public Goods(String name) {
System.out.println("Goods(String name)");
this.name = name;
}
public Goods() {
System.out.println("无参构造器...");
}
public int getId() {
System.out.println("Goods.getId()");
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
@Override
public String toString() {
return "[编号:" + id + ", 名称:" + name + ", 价格:" + price + "]";
}
}
获取Class对象的三种方式:
Class<?> c1 = (new Goods()).getClass(); // 对象名.getClass()
Class<?> c2 = Goods.class; // 类名.class
Class<?> c3 = Class.forName("com.bean.Goods"); // Class.forName("类的全路径名");
1.创建对象
Class clazz = Class.forName("com.bean.Goods");// 得到类字节码
// 创建对象1: 默认构造函数简写
Goods g1 = (Goods) clazz.newInstance();
// 创建对象2: 通过带参数构造器创建对象
Constructor<?> cons = clazz.getConstructor(int.class, String.class);
Goods g2 = (Goods) cons.newInstance(100, "可口可乐");
System.out.println(g1);
System.out.println(g2);
2.获取属性和值
Class clazz = Class.forName("com.bean.Goods");
Goods g = (Goods) clazz.newInstance();
System.out.println(g);
Field[] fil = clazz.getDeclaredFields();// 获取所有的属性名称
for (Field f : fil) {
f.setAccessible(true);// 设置强制访问
String name = f.getName();// 名称
Object value = f.get(g);// 值
System.out.println(name + "\t" + value);
}
3.获取方法
Class clazz = Class.forName("com.bean.Goods");
Goods g = (Goods) clazz.newInstance();
System.out.println(g);
Method met = clazz.getDeclaredMethod("getId");
Object ob = met.invoke(g);//方法的返回值
System.out.println(ob);