int
等基本类型, 其他类型都是class
class
的本质是数据类型(Type
). 无继承关系的数据类型无法赋值class
是JVM在执行过程中动态加载的. 每读取到一种class
类型, 就把他加载到内存中class
, JVM都会为其创建一个Class
类型的实例, 并关联起来Class
类型, 是一个名叫Class
的class
String
类时, 首先读取String.class
文件到内存, 然后为String
类创建一个Class
实例并关联起来Class cls = new Class(String)
Class
实例都指向一个数据类型(class
或interface
)┌───────────────────────────┐
│ Class Instance │──────> String
├───────────────────────────┤
│name = "java.lang.String" │
└───────────────────────────┘
┌───────────────────────────┐
│ Class Instance │──────> Random
├───────────────────────────┤
│name = "java.util.Random" │
└───────────────────────────┘
┌───────────────────────────┐
│ Class Instance │──────> Runnable
├───────────────────────────┤
│name = "java.lang.Runnable"│
└───────────────────────────┘
Class
实例包含了该class
的所有完整信息┌───────────────────────────┐
│ Class Instance │──────> String
├───────────────────────────┤
│name = "java.lang.String" │
├───────────────────────────┤
│package = "java.lang" │
├───────────────────────────┤
│super = "java.lang.Object" │
├───────────────────────────┤
│interface = CharSequence...│
├───────────────────────────┤
│field = value[],hash,... │
├───────────────────────────┤
│method = indexOf()... │
└───────────────────────────┘
Class
实例获取到该实例的所有信息.class
的Class
class
获取: Class cls = String.class
class
的完整类名, 通过Class.forName()
: Class cls = Class.forName("java.lang.String")
instanceof
不但匹配指定类型, 还能匹配指定类型的子类
==
可以准确判断数据类型, 但不能判断子类
String[]也是一种Class
, 不同于String.class, 类名是[Ljava.lang.String.
可以通过Class
实例, 来创建对应的实例
Class cls = String.class;
String s= (String) cls.newInstance();
new String()
Class.newInstance
局限: 无法调用带有参数的构造方法或者非public
的构造方法.getName()
: 返回字段名称getType()
: 返回字段类型getModifiers()
返回字段的修饰符, 它是一个int, 不同数值代表不同的含义Field
实例, 从而拿到一个实例对应的该字段的值SecurityManager
可能不允许java和javax
开头的package
的类调用.Field.set(Object, Object)
Class
所有的Method
Method
对象包含一个方法所有的信息.Method
就可以对其进行调用invoke
方法第一参数永远为nullMethod m = Integer.class.getMethod("parseInt", String.class);
Integer n = (Integer) m.invoke(null, "12345");
System.out.println(n);
IllegalAccessException
.Method.setAccessible(true)
允许调用getDeclaredMethod
来获取private
方法Class
提供的newInstance()
方法创建新的实例, 但只能调用public的无参构造方法Constructor
方法用来调用任意的构造方法, 包含了构造方法的所有信息getConstructor(Class...)
: 获取某个public
的Constructor
getDeclaredConstructor(Class...)
: 获取某个Constructor
getConstructors
: 获取所有public
的Constructor
getDeclaredConstructors()
获取所有的Constructor
调用非Public的Constructor
时, 必须通过setAccessible(true)
interface
的Class
都必定存在一种父类类型getInterface
: 返回当前类直接实现的接口类型, 不包括父类实现的接口类型interface
的Class
, 调用getSuperClass()
返回null
getInterface
返回空数组instanceof
Class
实例, 要判断向上转型是否成功, 使用isAssignable()
boolean c = Number.class.isAssignableFrom(Integer.class);
System.out.println(c); // true Integer可以赋值给Number
boolean e = Integer.class.isAssignableFrom(Number.class);
System.out.println(e); // false Number不能赋值给Integer
class
和interface
的区别
class
interface
CharSequence cs = new StringBuilder();
interface
的实例Proxy.newProxyInstance()创建接口对象
InvocationHandler handler = new InvocationHandler() { // 1: 创建invocationHandler方法
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println(method);
if (method.getName().equals("morning")) {
System.out.println("Good morning: " + args[0]);
}
return new Object();
}
};
// 2: 创建通过`newProxyInstance`创建实例
Hello hello = (Hello) Proxy.newProxyInstance( // 3: 强制转换类型
Hello.class.getClassLoader(), // 传入ClassLoader
new Class[] { Hello.class }, // 传入要实现的接口
handler); // 传入处理调用方法的InvocationHandler
hello.morning("bob");
interface
实例如下InvocationHandler
实例, 负责方法调用Proxy.newProxyInstance()
创建interface
实例, 三个参数如下:
ClassLoader
InvocationHandler
实例动态代理其实就是: JDK在运行期间动态创建class字节码并加载过程.
动态类改为静态实现类:
JDK就是编写了这么一个静态类, 不需要源码, 直接生成字节码
interface Hello {
void morning(String name);
}
class HelloDynamicProxy implements Hello {
InvocationHandler handler;
public HelloDynamicProxy(InvocationHandler handler) {
this.handler = handler;
}
public void morning(String name) {
try {
handler.invoke(
this,
Hello.class.getMethod("mornging"),
new Object[] {name});
} catch (Throwable t) {
}
}
}
Class
类型的class
是什么意思?String s= (String) cls.newInstance();
中间的(String)
如何理解?new Person () {}
是什么语法??原文:https://www.cnblogs.com/zhangrunhao/p/12575889.html