Java反射的应用
工厂应用案例
import java.lang.reflect.Method;
public class TestInvokeAnything {
public static void main(String[] args)throws Exception {
//invokeAny() --->执行方法
//(Object)对象、(String)方法名称、形参(class)、实参(object)、
Object o=createObject("com.qf.dayQuestion.t2.reflects.Student");
invokeAny(o,"exam", new Class[] {int.class,double.class,String.class}, 1,99,"唐三");
invokeAny(o, "study", null, null);
invokeAny(o, "study", new Class[] {int.class}, 109);
}
//通用编程,(可以调用任何一个方法)
public static void invokeAny(Object object,String methodName,Class[] types,Object ...args) throws Exception, Exception {
//使用反射技术执行任何方法
//类对象
Class c = object.getClass();
Method m= c.getDeclaredMethod(methodName, types);
//执行方法
m.invoke(object, args);
}
//工厂----》创建对象的工厂
public static Object createObject(String className) {
try {
Class c = Class.forName(className);
return c.newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
运行结果:
反射加工厂应用案例
import java.lang.reflect.Method;
public class TestInvokeMethod {
public static void main(String[] args) throws Exception, Exception {
//反射 类的对象
Object o = createObject("com.qf.dayQuestion.t2.reflects.Student");
// Student stu = (Student)o;
// stu.study();
// stu.exam();
Class c = o.getClass();//类对象
//name --->方法名,parameterYpers ->参数列表型
Method m = c.getMethod("study",null);
// System.out.println(m);
//通过invoke方法,执行某个实例方法,参数:Object->args ->调用的方法所需要的实参
m.invoke(o, null);
//--------------------------------------
Method m2= c.getMethod("study", int.class);
Object result = m2.invoke(o, 1111);//接收方法返回值,如果是基本类型,则转换为包装类型
System.out.println(result);
// System.out.println(c.getMethod("study", int.class).invoke(o, 1111));
//----------------------------------------------
Method m3= c.getMethod("exam",int.class,double.class,String.class);
m3.invoke(o, 23,99,"唐三");
//----------------------------------
// Method m4= c.getMethod("calc", null);//eeror 无法获得私有方法
Method m4= c.getDeclaredMethod("calc", null);//获得自身方法,包含私有
// System.out.println(m4);
//---------------------
//注意,反射是一种Java底层技术,可以预言检查,可以突破封装
m4.setAccessible(true);
m4.invoke(o, null);
}
//工厂----》创建对象的工厂
public static Object createObject(String className) {
try {
Class c = Class.forName(className);
return c.newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
class Student{
String name;
String age;
String sex;
Double score;
public Student() {}
public Student(String name, String age, String sex, Double score) {
super();
this.name = name;
this.age = age;
this.sex = sex;
this.score = score;
}
public void study() {
System.out.println("正在学习.........");
}
public int study(int a) {
System.out.println("学习"+a+"个小时");
return 0;
}
public void exam(int a,double b,String s) {
System.out.println(s+"正在考试"+a+"个小时的测验"+b+"分");
}
private void calc() {
System.out.println("计算..........");
}
}
运行结果