大家好,乐字节小乐继续为 Java 初学者讲述 Java 基础知识。上次说到乐字节 Java 反射之三:方法、数组、类加载器,这次是 Java 反射之四:反射相关操作
1、操作属性
//1、获取 Class 对象
Class<?> clz=Class.forName("com.shsxt.ref.simple.User");
//2、获取对象
User u=(User)clz.newInstance();
//3、设置属性
Field field=clz.getDeclaredField("uname");
field.setAccessible(true);// 打开权限
field.set(u, "0523");
//4、获取此属性
System.out.println(field.get(u));
2、调用方法
调用方法,都是直接对象. 方法 ([实参]); 反射之后,动态调用方法需要使用 invoke 即可。
1)、方法调用
//1、获取 Class 对象
Class<?> clz=Class.forName("com.shsxt.ref.simple.User");
//2、获取对象
User u=(User)clz.newInstance();
//3、获取方法
Method m =clz.getMethod("coding", String.class,String.class);
//4、成员方法的调用
m.invoke(u, "反射","多个参数");
// 若是静态方法,传递 null 即可 因为静态方法属性类,不属于对象
m=clz.getMethod("testStatic",int.class);
m.invoke(null, 100);// 与对象无关
2)、操作 setter 与 getter 访问器
/**
* @param obj 操作的对象
* @param att 操作的属性
* @param value 设置的值
* */
public static void setter(Object obj, String att,Object value) {
try {
//setUname setUpwd --> 第一个字母大写
att=att.substring(0,1).toUpperCase()+att.substring(1);
Method method = obj.getClass().getMethod("set" + att, value.getClass());
method.invoke(obj, value);
} catch (Exception e) {e.printStackTrace();
}
}
public static Object getter(Object obj, String att) {
try {
//getUname getUpwd --> 第一个字母大写
att=att.substring(0,1).toUpperCase()+att.substring(1);
Method method = obj.getClass().getMethod("get" + att);
return method.invoke(obj);
} catch (Exception e) {e.printStackTrace();
}
return null;
}
main 方法
//1、获取 Class 对象
Class<?> clz=Class.forName("com.shsxt.ref.simple.User");
//2、获取对象
User u=(User)clz.newInstance();
//3、设置值
setter(u,"uname","shsxt");
// 获取值
String str=(String) getter(u,"uname");
System.out.println(str);
3、利用反射编写简单工厂设计模式
利用反射 + 配置文件可以实现简单工厂模式。
interface Car{void run();
}
class Bmw implements Car{public void run(){System.out.println("小样,学的怎么样");
}
}
class QQ implements Car{public void run(){System.out.println("大哥,救我");
}
}
class Benz implements Car{public void run(){System.out.println("哈哈");
}
}
// 简单工厂
class CarFactory{public static Car product2(String carStr){if(carStr.equals("qq")){return new QQ();
}else if(carStr.equals("benz")){return new Benz();
}
// 如有其它车辆,需要添加代码
return null;
}
/**
* 根据字符串 创建对象
* @param carStr
* @return
*/
public static Car product(String carStr){
try {return (Car)Class.forName(carStr).newInstance();} catch (InstantiationException e) {e.printStackTrace();
} catch (IllegalAccessException e) {e.printStackTrace();
} catch (ClassNotFoundException e) {e.printStackTrace();
}
return null;
}
}
#car.properties
qq=com.shsxt.ref.simplefactory.QQ
benz=com.shsxt.ref. simplefactory.Benz
bmw=com.shsxt.ref. simplefactory.Bmw
public static void main(String[] args) throws Exception {
// 加载配置文件
Properties pro =new Properties();
pro.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("car.properties"));
// 获取对应的 完整路径 (报名. 类名)
String clz =pro.getProperty("qq");
CarFactory.product(clz).run();}
Java 反射相关知识就讲到这里了,下次我们进入到 JavaSE 的课程:循环控制
请继续关注乐字节,Java 知识技术分享,乐字节原创