日常当中遇到的java知识点积累
目录
java反射
1.getMethod()不能调用私有方法
public class ReflectTest {
static class User
{
private String name;
private int agge;
private String getName()
{
return name;
}
private void setName(String name)
{
this.name = name;
}
private int getAge()
{
return agge;
}
}
public static void main(String[] args) throws Exception
{
User user = new User();
user.setName("小菜");
//只能调用公共方法
Method[] methods = User.class.getMethods();
for (Method method : methods)
{
if ("getName".equals(method.getName()))
{
System.out.println(method.invoke(user));
}
else if ("setName".equals(method.getName()))
{
//调用setName方法设置名字为"大鸟"
method.invoke(user, "大鸟");
System.out.println(user.getName());
}
}
}
}
上面代码,User类全是私有方法,那么User.class.getMethods()时不会报错,但是获取不到方法,所以遍历没有输出
public class ReflectTest {
static class User
{
private String name;
private int age;
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public int getAge()
{
return age;
}
}
public static void main(String[] args) throws Exception
{
User user = new User();
user.setName("小菜");
//只能调用公共方法
Method[] methods = User.class.getMethods();
for (Method method : methods)
{
if ("getName".equals(method.getName()))
{
//调用getName()方法,无参不用传
System.out.println(method.invoke(user));
}
else if ("setName".equals(method.getName()))
{
//调用setName方法设置名字为"大鸟",并且必须传入参数,否则报错
method.invoke(user, "大鸟");
System.out.println(user.getName());
}
}
}
}
将私有改为公共方法,可以获取到,如果方法method带有参数,那么metho.invoke()第一个参数为对象,然后method有几个参数,就在对象后面传多少个参数,不然报错。 java里的反射并不是只能获取值,还可以动态的给某个方法赋值。 输出:小菜 大鸟
2. public Method getDeclaredMethod(String name, Class<?>… parameterTypes)
public class ClassDemo {
public static void main(String[] args) {
ClassDemo cls = new ClassDemo();
Class c = cls.getClass();
try {
// parameter type is null
Method m = c.getDeclaredMethod("show", null);
System.out.println("method = " + m.toString());
// method Integer
Method lMethod = c.getDeclaredMethod("showInteger", Integer.class);
System.out.println("method = " + lMethod.toString());
} catch(NoSuchMethodException e) {
System.out.println(e.toString());
}
}
private Integer show() {
return 1;
}
public void showInteger(Integer i) {
this.i = i;
}
public int i = 78655;
}
输出: method = private java.lang.Integer com.lzb.javabase.ClassDemo.show()
method = public void com.lzb.javabase.ClassDemo.showInteger(java.lang.Integer)
例子来源于:https://www.tutorialspoint.com/java/lang/class_getdeclaredmethod.htm
getdeclaredmethod()方法返回一个方法对象,该方法对象反映该类对象表示的类或接口的指定声明方法。name参数是一个字符串,它指定所需方法的简单名称, parameterTypes参数是一个类对象数组,它按照声明的顺序标识方法的形式参数类型。说白就是根据方法名和方法参数返回一个方法对象。
3.getParameterTypes()
/**
* java反射调用set方法赋值
* @author lizhibiao
* @date 2019/7/16 15:54
*/
public class ClassDemo {
static class User
{
private String name;
private int age;
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public void test(User user)
{
}
}
public static void main(String[] args) throws Exception
{
User user = new User();
user.setName("小菜");
//只能调用公共方法
Method[] methods = User.class.getMethods();
for (Method method : methods)
{
if ("test".equals(method.getName()))
{
//method.getParameterTypes()[0]获取的是User类下test()方法第一个参数,该参数就是一个User对象
System.out.println(method.getParameterTypes()[0].toString());
//根据拿到的User对象,我们可以再去调用User对象下的getName方法,然后传入当前user对象进行反射调用
System.out.println(method.getParameterTypes()[0].getMethod("getName").invoke(user));
}
}
}
}
method.getParameterTypes()[0]获取的是该方法第一个参数对象,然后我们可以很方便再去获取该参数对象下的所有方法