老师,这样对吗?为什么控制台没有结果?
来源:3-10 自由编程
阿硕A
2020-07-06 18:52:17
package com.imooc.methodtest;
import java.lang.reflect.Method;
import org.junit.Test;
public class AddressTest {
@Test
/**
* 通过Method调用公有无参方法
*/
public void demo1() throws Exception {
//获得class
Class class1 = Class.forName("com.imooc.methodtest.Address");
//实例化
Address add = (Address) class1.newInstance();
//获得方法
Method method = class1.getMethod("display");
//设置权限
method.setAccessible(true);
//执行
method.invoke(add);
}
@Test
/**
* 调用私有无参方法
*/
public void demo2() throws Exception {
//获得class
Class class2 = Class.forName("com.imooc.methodtest.Address");
//实例化
Address add = (Address) class2.newInstance();
//获得方法
Method method = class2.getDeclaredMethod("into");
//设置权限
method.setAccessible(true);
//执行
method.invoke(add);
}
@Test
/**
* 调用私有有参方法
*/
public void demo3() throws Exception {
//获得Class
Class class3 = Class.forName("com.imooc.methodtest.Address");
//实例化
Address add = (Address) class3.newInstance();
//获得方法
Method method = class3.getDeclaredMethod("equalsAddress", String.class);
//设置权限
method.setAccessible(true);
//执行
method.invoke(add, "阿硕!");
}
}
package com.imooc.methodtest;
public class Address {
private String id;
private String name;
private String site;
private String phone;
public void Address() {
}
public Address(String id, String name, String site, String phone) {
super();
this.id = id;
this.name = name;
this.site = site;
this.phone = phone;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSite() {
return site;
}
public void setSite(String site) {
this.site = site;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
@Override
public String toString() {
return "Address [id=" + id + ", name=" + name + ", site=" + site + ", phone=" + phone + "]";
}
public void display(){
System.out.println("这是一个地址!");
}
private void info(){
System.out.println("我是私有方法!");
}
private void equalsAddress(String name){
if(getName().equals(name)){
System.out.println("相等");
}else {
System.out.println("不相等");
}
}
}
3回答
同学你好,demo3是不正确的,同学这里并没有给method进行权限设置。修改如下:
method.setAccessible(true);

Ps:三个demo测试,同学可以先一一进行运行,单独运行成功后可以在一并执行,这样便于同学找出问题哦
祝学习愉快~
阿硕A
提问者
2020-07-07
package com.imooc.methodtest;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import org.junit.Test;
public class AddressTest {
@Test
/**
* 通过Method调用公有无参方法
*/
public void demo1() throws Exception {
//获得class
Class class1 = Class.forName("com.imooc.methodtest.Address");
//实例化
Address add = (Address) class1.newInstance();
//获得方法
Method method = class1.getMethod("display");
//设置权限
method.setAccessible(true);
//执行
method.invoke(add);
}
@Test
/**
* 调用私有无参方法
*/
public void demo2() throws Exception {
//获得class
Class class2 = Class.forName("com.imooc.methodtest.Address");
//实例化
Address add = (Address) class2.newInstance();
//获得方法
Method method = class2.getDeclaredMethod("info");
//设置权限
method.setAccessible(true);
//执行
method.invoke(add);
}
@Test
/**
* 调用私有有参方法
*/
public void demo3() throws Exception {
//获得Class
Class class3 = Class.forName("com.imooc.methodtest.Address");
//实例化
Address add = (Address) class3.newInstance();
//获得方法
Method method = class3.getDeclaredMethod("equalsAddress",String.class);
Field field = class3.getDeclaredField("name");
//设置权限
field.setAccessible(true);
//设置参数
field.set(add,"阿硕!");
//执行
method.invoke(add, "阿硕!");
}
}
对吗老师?
好帮手慕小脸
2020-07-06
同学你好,分开测试同学代码有如下问题:
1、demo1方法中,调用无参构造方法,在同学的实体类中并没有定义无参构造。修改如下:

2、测试demo2方法出现如下错误:

没有找到into方法,原因是因为同学单词书写错误,是info

3、执行demo3方法,出现空指针异常,如下:

如果没有使用带参构造方法,getName获取为null,所以报异常,这里建议使用带参构造方法实例化,或者无参构造方法实例化后设置属性。
例如:

如果我的回答解决了你的疑惑,请采纳。祝:学习愉快~
相似问题