一、获取有参成员方法(ReflectDemo1.java)
1.获取字节码对象
2.getMethod("", )使用,无返回值,有一参,有两参
getDeclaredMethod("", ),访问私有要有*.setAccessible(true);//暴力访问
3.有返回值的用法
ReflectDemo1.java
package com.java.test;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
public class ReflectDemo1 {
public static void main(String[] args) throws Exception {
//获取字节码对象
Class c = Class.forName("com.java.test.Student");
Constructor con = c.getConstructor();
Object obj = con.newInstance();
Method m1 = c.getMethod("show");//无参方法调用
m1.invoke(obj);
Method m2 =c.getMethod("method", String.class);//带一个参的方法调用
m2.invoke(obj,"Hello");//传递一个参数
Method m3 = c.getMethod("getString", String.class,int.class);//带二个参的方法调用
// m3.invoke(obj, "张三",19);
// String s = (String)m3.invoke(obj, "张三",19);
Object objString = m3.invoke(obj, "张三",19);
System.out.println(objString);
// Method m4 = c.getDeclaredMethod("", )//调用私有方法
// m4.setAccessible(true);//暴力访问
}
}
Student.java
package com.java.test;
public class Student {
private String name;
private int age;
public int num;
public Student() {
super();
}
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
public Student(String name, int age, int num) {
super();
this.name = name;
this.age = age;
this.num = num;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public void show(){
System.out.println("show");
}
public void method(String s) {
System.out.println("method:"+s);
}
public String getString(String name,int age) {
// System.out.println(name+"的年龄"+age);
return name+"的年龄"+age;
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + ", num=" + num + "]";
}
}
二、对反射的简单理解和注意点
随着写代码越来越多,发现反射无非是一个反过程,就拿上面这个调用成员方法来说,首先我们一定要做的就是获取字节码对象,获取之后得到构造方法,然后调用构造方法,似曾相识的new一个对象也是如此。然后得到成员方法,传递参数。
对于反射来说私有方法也可以取用,得到后要用*.setAccessible(true);进行暴力访问。