/**
* @Title: 反射方式调用构造方法
* @return void
*/
public void invokeConstructor() throws Exception {
String className = "XXXXX";
// 创建一个Class对象,用于描述Person类
Class<?> clazz = Class.forName(className);
/**
* 调用有参的构造方法
*/
// 指明所要调用的构造方法的形参
Class<?>[] argTypes = { String.class, Integer.class };
// 获取指定参数的构造方法
Constructor<?> constructor = clazz.getConstructor(argTypes);
// 通过给定的实参,创建一个对象,它的返回值即新建对象的句柄
Object obj = constructor.newInstance("ddd", 333);
/**
* 调用无参构造方法
*
* @see 也可以使用下面的两种方式,获取无参的构造方法
* @see constructor = clazz.getConstructor(new Class[0])
* @see constructor = clazz.getConstructor(null)
* @see 另外也可以使用obj = clazz.newInstance()创建无参构造方法的一个对象
*/
// 获取无参的构造方法,并使用其创建一个对象
obj = clazz.getConstructor().newInstance();
}
/**
*
* @Title: 反射方式调用单例
* @param @throws Exception
* @return void
* @throws
*/
public void invokeSingleton() throws Exception {
String className = "XXXXX";
// 反射调用单例(无参)
Class c = Class.forName(className);
Method m = c.getDeclaredMethod("getInstance");
// 若调用private方法,设置此属性,即可访问
// m1.setAccessible(true);
Object obj = m.invoke(c);
// 反射调用单例(有参)
Class c1 = Class.forName(className);
// Class<?>[] cc = {String.class};
// Method m =c.getDeclaredMethod("getInstance",cc);
Method m1 = c1.getDeclaredMethod("getInstance", String.class);
// 若调用private方法,设置此属性,即可访问
// m1.setAccessible(true);
Object obj1 = m1.invoke(c, "我是参数字符串");
}
/**
*
* @Title: 得到某个对象的属性
* @param owner
* @param fieldName
* @return Object
* @throws
*/
public Object getProperty(Object owner, String fieldName) throws Exception {
Class ownerClass = owner.getClass();
Field field = ownerClass.getField(fieldName);
Object property = field.get(owner);
return property;
}
/**
*
* @Title: 得到某个类的静态属性
* @param className
* @param fieldName
* @return Object
* @throws
*/
public Object getStaticProperty(String className, String fieldName)
throws Exception {
Class ownerClass = Class.forName(className);
Field field = ownerClass.getField(fieldName);
Object property = field.get(ownerClass);
return property;
}
/**
*
* @Title: 执行某对象的方法
* @param owner
* @param methodName
* @param args
* @return Object
*/
public Object invokeMethod(Object owner, String methodName, Object[] args)
throws Exception {
Class ownerClass = owner.getClass();
// 参数类型
Class[] argsClass = new Class[args.length];
for (int i = 0, j = args.length; i < j; i++) {
argsClass[i] = args[i].getClass();
}
Method method = ownerClass.getMethod(methodName, argsClass);
return method.invoke(owner, args);
}
/**
*
* @Title: 执行某个类的静态方法
* @param className
* @param methodName
* @param args
* @return Object
* @throws
*/
public Object invokeStaticMethod(String className, String methodName,
Object[] args) throws Exception {
Class ownerClass = Class.forName(className);
Class[] argsClass = new Class[args.length];
for (int i = 0, j = args.length; i < j; i++) {
argsClass[i] = args[i].getClass();
}
Method method = ownerClass.getMethod(methodName, argsClass);
return method.invoke(null, args);
}
转发
java反射
最新推荐文章于 2024-11-01 09:00:00 发布