package com.lin.reflect_01;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
/*
* 通过反射获取成员方法(Method)并使用
*
* */
public class ReflectDemo {
public static void main(String[] args) throws Exception {
// 1.获取该Person类的字节码文件
Class c= Class.forName("com.lin.reflect_01.Person");
// 2.获取构造器,公共的无参构造
Constructor con=c.getConstructor();
// 通过构造器对象创建该类的实例
Object obj=con.newInstance();//--->Person p=new Person();
// 获取成员方法:Method
// public Method[] getDeclaredMethods():获取该类中所有的成员方法(私有的、默认的、受保护的),不包含继承方法
// public Method[] getMethods():获取该类中所有的公共的成员方法以及继承的公共的方法
// Method[]methods=c.getMethods();
/*
Method[]methods=c.getDeclaredMethods();
for(Method m:methods) {
System.out.println(m);
}
*/
// 获取指定的成员方法(单个的)
// public Method getMethod(String name,Class<?>... parameterTypes):获取单个的公共的成员方法
// public Method getDeclaredMethod(String name,Class<?>... parameterTypes):获取单个的指定的成员方法(包括私有)
// 参数1:是当前方法名称
// 参数2:该方法的形式参数的class属性
Method m1=c.getMethod("show");
// System.out.println(m1);
// 有一种底层调用方式
// public Object invoke(Object obj,Object... args)
// 参数1:该类的对象(obj)
// 参数2:调用方法传递实际参数
// 返回值:如果当前调用的方法没有返回值,不需要返回,如果有返回值,返回即可!
m1.invoke(obj);//show Person...
System.out.println("----------------------");
// 获取Method对象
Method m2=c.getMethod("function");
// 调用function方法
Object object=m2.invoke(obj);//相当于Object object=new String();
System.out.println(object);
System.out.println("----------------------");
// 获取method对象
Method m3=c.getMethod("method", int.class);
Object object2=m3.invoke(obj, 300);
System.out.println(object2);
System.out.println("----------------------");
// 获取Method对象
Method m4=c.getDeclaredMethod("function2", String.class);
// 强制取消java语言访问检查
m4.setAccessible(true);
// 调用function2方法 私有
Object object3=m4.invoke(obj,"hellojava");
}
}
package com.lin.reflect_01;
public class Person {
private String name ;//姓名
int age ;
public String address ;
//构造方法
//公共无参构造
public Person() {
}
//私有的带一个参数的构造方法
private Person(String name) {
this.name = name ;
}
//单两个参数的,默认修饰符的构造方法
Person(String name,int age){
this.name = name ;
this.age = age ;
}
//公共的带三个参数的构造方法
public Person(String name,int age,String address) {
this.name = name ;
this.age = age ;
this.address = address;
}
//提供一个成员方法
public void show() {
System.out.println("show Person...");
}
public String function() {
return "hello" ;
}
public String method(int num) {
return "JavaEE"+num ;
}
private void function2(String str) {
System.out.println(str);
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ", address=" + address + "]";
}
}