获取构造方法
Constructor con = clazz.getConstructor(Class…参数类型);
clazz.getDeclaredConstructor();
clazz.getDeclaredConstructors();
Constructor类中的常用方法
con.getModifiers();
con.getName();
con.getParameterTypes(); // 参数类型
con.getExceptionTypes(); // 异常类型
操作构造方法,执行创建对象
Object obj = con.newInstance(执行构造方法时所需要的参数);
con.setAccessible(true);
主方法:
package com.csdn.study;
import java.lang.reflect.Field;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
public class Test {
public static void main(String[] args){
try {
Class clazz = Person.class; // 找Person对应的class
Constructor con = clazz.getConstructor();// 找寻clazz中的无参构造方法
Constructor con2 = clazz.getConstructor(String.class); // 找寻clazz中的带String参数构造方法
// 执行
Person person =(Person)con.newInstance();
Field field = clazz.getDeclaredField("name");
field.setAccessible(true);
field.set(person,"张三");
System.out.println(person); // 张三
System.out.println(con.getModifiers()); // 1
System.out.println(con.getName()); // com.csdn.study.Person
System.out.println(con.getParameterTypes()); // [Ljava.lang.Class;@74a14482
System.out.println(con.getExceptionTypes()); // [Ljava.lang.Class;@1540e19d
}catch(NoSuchMethodException e){
e.printStackTrace();
}catch(InstantiationException e){
e.printStackTrace();
}catch(IllegalAccessException e){
e.printStackTrace();
}catch(InvocationTargetException e){
e.printStackTrace();
}catch(NoSuchFieldException e){
e.printStackTrace();
}
}
}
Person类:
package com.csdn.study;
public class Person extends Animal{
private String name;
public Person(){}
public Person(String name){
this.name = name;
}
public String toString(){
return this.name;
}
}
输出结果:
张三
1
com.csdn.study.Person
[Ljava.lang.Class;@74a14482
[Ljava.lang.Class;@1540e19d
获取私有的构造方法
主方法:
package com.csdn.study;
import java.lang.reflect.Field;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
public class Test {
public static void main(String[] args){
try {
// 如果构造方法是私有的
Class clazz = Person.class;
Constructor con = clazz.getDeclaredConstructor(); // 获取私有的构造方法
con.setAccessible(true); // 设置为可操作的
Person person = (Person)con.newInstance(); // 创建对象
Field field = clazz.getDeclaredField("name"); // 获取属性
field.setAccessible(true); // 设置为可操作
field.set(person,"李四"); // 操作属性
System.out.println(person); // 输出李四
}catch(NoSuchMethodException e){
e.printStackTrace();
}catch(InstantiationException e){
e.printStackTrace();
}catch(IllegalAccessException e){
e.printStackTrace();
}catch(InvocationTargetException e){
e.printStackTrace();
}catch(NoSuchFieldException e){
e.printStackTrace();
}
}
}
Person类只是把两个构造方法改成private而已,其他没变
操作类中的方法
Class类中的方法
Method method = clazz.getMethod("方法名“,Class...参数类型); // 可以获取本类和父类的(私有)
Method[] methods = clazz.getMethods(); // 获取所有公有的方法,本类和父类的
Method method = clazz.getDeclaredMethod(); // 获取私有的方法,只能本类的
Method[] methods = clazz.getDeclaredMethods(); // 获取所有的私有方法
Method类中常用的方法
int m = method.getModifiers();
Class mreturn = method.getReturnType(); // 获取返回值的数据类型
String name = method.getName(); // 获取方法的名字
Class[] mpts = method.getParemeterTypes(); // 获取参数列表所有参数的类型
Class[] mets = method.getExceptionTypes(); // 获取方法抛出的异常类型
操作方法,执行方法
Object result = invoke(对象,执行方法需要的参数);如果方法本身没有返回值,则返回null
主方法:
package com.csdn.study;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Test {
public static void main(String[] args){
try {
Class clazz = Person.class;
Constructor con = clazz.getConstructor(String.class);
Person person = (Person)con.newInstance("张三");
Method method = clazz.getMethod("eat");
Object returnResult = method.invoke(person); // 执行方法,输出了Person中 public void eat(){}
System.out.println(returnResult); // 输出null
Method method2 = clazz.getMethod("eat",String.class); // 获取带String参数的方法
Object returnResult2 = method2.invoke(person,"吃饭");// 执行方法,输出:Person中 public void eat(String str){}
System.out.println(returnResult2); // 输出 吃饭,因为有返回值
}catch(NoSuchMethodException e){
e.printStackTrace();
}catch(InstantiationException e){
e.printStackTrace();
}catch(IllegalAccessException e){
e.printStackTrace();
}catch(InvocationTargetException e){
e.printStackTrace();
}
}
}
Person类:
package com.csdn.study;
public class Person extends Animal{
private String name;
public Person(){}
public Person(String name){
this.name = name;
}
public void eat(){
System.out.println("Person中 public void eat(){}");
}
public String eat(String str){
System.out.println("Person中 public void eat(String str){}");
return str;
}
public String toString(){
return this.name;
}
}
获取私有方法就不展示了,都是一样的。还有获取所有的公有方法,所有的私有方法,也不演示了。