编译后生成的类文件
类名规则及编译后产生的类文件
javac -encoding utf-8 ExternalClass.java
java ExternalClass
// 结果
外部类 : ExternalClass
内部静态类 : ExternalClass$InnerStaticClass
内部成员类 : ExternalClass$MemberClass
局部内部类 : ExternalClass$1LocalNestedClass
匿名内部类 : ExternalClass$1
lambda表达式类 : ExternalClass$$Lambda$1/834600351
Java动态代理类 : com.sun.proxy.$Proxy0
import java.lang.reflect.Proxy;
/**
* Java类类名规则
* ExternalClass.class
*/
public class ExternalClass {
/**
* 静态内部类
* ExternalClass$InnerStaticClass.class
* 类名:【外部类】$【静态内部类】 ,和外部类无太多关系,
* 只是能在外部类的静态方法中访问次静态类,比如在main方法中可以直接 new InnerStaticClass()
*/
static class InnerStaticClass {}
/**
* 内部成员类
* 内部成员类 ExternalClass$MemberClass.class
* 类名:【外部类】$【内部成员类】
*/
public class MemberClass {}
public void memberClass() {
System.out.println("内部成员类 : " + MemberClass.class.getName());
}
/**
* 局部内部类
* ExternalClass$1LocalNestedClass.class
* 类名:【外部类】$【数字】【局部内部类】
*/
public void localNestedClass() {
class LocalNestedClass {}
System.out.println("局部内部类 : " + LocalNestedClass.class.getName());
}
/**
* 匿名内部类(匿名类没有名字,匿名类不管是成员匿名类还是局部匿名类,都是一样的规则)
* ExternalClass$1.class
* 类名:【外部类】$【数字】
*/
public void anonymousClass() {
Runnable runnable = new Runnable() {
@Override
public void run() {
}
};
System.out.println("匿名内部类 : " + runnable.getClass().getName());
}
/**
* lambda表达式类(不会生成.class文件)
* ExternalClass$$Lambda$1/834600351
* 类名:【外部类】$$Lambda$【数字】
*/
public void lambdaExpressionClass() {
Runnable runnable = () -> {};
System.out.println("lambda表达式类 : " + runnable.getClass().getName());
}
/**
* Java动态代理类(不会生成.class文件,只会生成ProxyClass.class文件)
* 类名:$Proxy【数字】
*/
public void proxyClass() {
Object obj = Proxy.newProxyInstance(ExternalClass.class.getClassLoader(),
new Class[]{Runnable.class}, new ProxyClass());
System.out.println("Java动态代理类 : " + obj.getClass().getName());
}
public static void main(String[] args) {
System.out.println("外部类 : " + ExternalClass.class.getName());
System.out.println("内部静态类 : " + InnerStaticClass.class.getName());
ExternalClass obj = new ExternalClass();
obj.memberClass();
obj.localNestedClass();
obj.anonymousClass();
obj.lambdaExpressionClass();
obj.proxyClass();
}
}
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class ProxyClass implements InvocationHandler {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
return null;
}
}