http://www.imooc.com/qadetail/64474,有个相关的回答,但是不懂
我使用的是intellij idea,主要问题是获取类名字时我只能使用的是infce.getSimpleName(),而不能使用infce.getName(),看过生成的java文件,getName()是类全名(包括包名),但是会显示如下错误
C:\Users\Wind\IdeaProjects\DesignPatterns\out\production\DesignPatterns\Proxy\com\imooc\chapter3_1\$Proxy0.java:12: 错误: 找不到符号
Method md = Proxy.com.imooc.chapter3_1.Moveable.class.getMethod("move");
^
符号: 类 com
位置: 类 Proxy
for (Method m : infce.getMethods()) {
methodStr += " @Override" + rt +
" public void " + m.getName() + "() {" + rt +
" try{" + rt +
" Method md = " + infce.getSimpleName() + ".class.getMethod(\""
+ m.getName() + "\");" + rt +
" invocationHandler.invoke(this,md);" + rt +
" }catch(Exception e){ e.printStackTrace();}" + rt +
" }";
}
String str =
"package Proxy.com.imooc.chapter3_1;" + rt +
"import java.lang.reflect.Method;" + rt +
"public class $Proxy0 implements " + infce.getSimpleName() + " {" + rt +
" public $Proxy0(InvocationHandler invocationHandler) {" + rt +
" super();" + rt +
" this.invocationHandler = invocationHandler;" + rt +
" }" + rt +
" private InvocationHandler invocationHandler;" + rt +
methodStr + rt +
"}";
//产生代理类的java文件
String fileName = System.getProperty("user.dir") + "\\out\\production\\DesignPatterns\\Proxy\\com\\imooc\\chapter3_1\\$Proxy0.java";
再重新试了一下,两个其实都行,我之前出现不行的情况,是因为我的包名为Proxy.com.imooc.chapter3_1.XXX,然后包路径下同时有一个Proxy的类,所以可能导致了无法正确解析Proxy是一个包还是一个类,如果修改为正确的话那么两种方法都可以,
从这里可以看出我们日常命名规范的一些重要性
给出一个类似的例子:
package proxy.com.imooc.test;
/**
* Created with IntelliJ IDEA.
* @author Wind
* @version V1.0
* @Description: .
* @Date 2016/2/17 19:34
*/
public class Test {
public static void main(String[] args) {
new proxy.com.imooc.test.proxy();
}
}
class proxy {
}
报错如下:
C:\Users\Wind\IdeaProjects\DesignPatterns\src\proxy\com\imooc\test\Test.java
Error:(12, 18) java: 找不到符号
符号: 类 com
位置: 类 proxy.com.imooc.test.proxy