本系列博客汇总在这里:框架基础 汇总
说明
- 如果底层方法是实例方法,第一个参数就是该对象实例,第二个参数是方法的参数列表,invoke 的返回值就是实例方法的返回值。
- 如果底层方法是静态的,那么可以忽略指定的 obj 参数。该参数可以为 null。
- 如果底层方法所需的形参数为 0,则所提供的 args 数组长度可以为 0 或 null。
代码演示
package cn.wyx.reflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class ReflectDemo3
{
public static void main(String[] args) throws Exception
{
Class<?> class1 = Class.forName("cn.wyx.reflect.Person");
// 获得构造器
Constructor<?> constructor = class1.getDeclaredConstructor(new Class[] {});
// 根据类的默认构造器来获得一个对象
Object instance = constructor.newInstance(new Object[] {});
Method method = class1.getDeclaredMethod("setName",new Class[] { String.class });
Object invoke = method.invoke(instance, new Object[] { "魏宇轩" });
// Method mget = class1.getDeclaredMethod("getName", new Class[]{});
Method mget = class1.getDeclaredMethod("getName", null);
Object invoke2 = mget.invoke(instance, new Object[] {});
Method method2 = class1.getDeclaredMethod("printInfo", null);
// 破坏私有方法,让我们能调用
method2.setAccessible(true);
Object invoke3 = method2.invoke(null, null);
}
}
package cn.wyx.reflect;
public class Person
{
private Integer id;
private String name;
private String address;
public Person()
{
}
public Person(Integer id, String name, String address)
{
super();
this.id = id;
this.name = name;
this.address = address;
}
private static void printInfo()
{
System.out.println("静态方法的反射调用");
}
public Integer getId()
{
return id;
}
public void setId(Integer id)
{
this.id = id;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public String getAddress()
{
return address;
}
public void setAddress(String address)
{
this.address = address;
}
@Override
public String toString()
{
return "Person [id=" + id + ", name=" + name + ", address=" + address
+ "]";
}
}
如有错误,欢迎指正!