??????????????????????????????????????Java?????????????????????????????????2???????????????RTTI????????????????????????????е?????????????????????????????????????????????????????????
????1??Class????
???????RTTI??Java?е????????????????????????????????????α???????????Class????????????????????????й???????Class??????????????????“????”??????Java???Class?????????RTTI?????????????е?????????????????????????
??????????????????????Class????????????.class????????????????????????????????????JVM???????????????????????????????????????????Class?????????????????????static??????????????????е??
public class TestMain {
public static void main(String[] args) {
System.out.println(XYZ.name);
}
}
class XYZ {
public static String name = "luoxn28";
static {
System.out.println("xyz?????");
}
public XYZ() {
System.out.println("xyz??????");
}
}
?????????????

????????????????????????Class??????????????????????δ?????????????????????????????????.class?????
???????????????????????????????????(??????Base????)??Class????????????ù???Class.forName(“Base”)???????????????????base.class??????????????????ù???”.class”??????Class??????????????????????????Class???????forName()????????????Class?????????????????????????????????3?????裺
??????????????????????????????????????????Class????
???????????????е?????????????????
???????????????????г????????????????о????????????????????
public class Base {
static int num = 1;
static {
System.out.println("Base " + num);
}
}
public class Main {
public static void main(String[] args) {
// ?????????????
Class clazz1 = Base.class;
System.out.println("------");
// ??????
Class clazz2 = Class.forName("zzz.Base");
}
}
????2?????????????????
???????????????????????????????????????????????????????????????????????instanceof?ж??
class Base { }
class Derived extends Base { }
public class Main {
public static void main(String[] args) {
Base base = new Derived();
if (base instanceof Derived) {
// ????????????????
System.out.println("ok");
}
else {
System.out.println("not ok");
}
}
}
????3????????????????
????????????????????????????RTTI??????????????????????????????????????????????????????RTTI?????????Class????java.lang.reflect???????????????????????????Field??Method??Constructor????Щ????????JVM??????????????????δ???????????????????????????Contructor?????μ??????get()??set()??????????????????Field???????????Σ???invoke()??????????Method???????????????????????????getFields()??getMethods()??getConstructors()????????????????????????Ρ????????????????????????飬??????????????????????????????????????????????????????????????κ????顣
????????????????????????????????????????δ???????????????JVM???????????????????????????????????????????.class????JVM???????????????????????????????????????????????RTTI???????????????????????
????RTTI????????????????????.class???
???????????????????.class???
public class Person implements Serializable {
private String name;
private int age;
// get/set????
}
public static void main(String[] args) {
Person person = new Person("luoxn28"?? 23);
Class clazz = person.getClass();
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
String key = field.getName();
PropertyDescriptor descriptor = new PropertyDescriptor(key?? clazz);
Method method = descriptor.getReadMethod();
Object value = method.invoke(person);
System.out.println(key + ":" + value);
}
}
???????????getReadMethod()???????????get?????????????getWriteMethod()?????????????set????????????????????????÷??乤????????????????????????????????????Java??????????????????????????????л???JavaBean???
????4?????????
????????????????????????????????????????????”???”??????????Щ?????漰????”???”?????????????????????м???????Java?????????????????????????????????????????????????????????????????????á????????????????????е?????????????????????????????????????????????????????????????????????????????????
?????????????
public interface Interface {
void doSomething();
void somethingElse(String arg);
}
public class RealObject implements Interface {
public void doSomething() {
System.out.println("doSomething.");
}
public void somethingElse(String arg) {
System.out.println("somethingElse " + arg);
}
}
????????????????????
public class DynamicProxyHandler implements InvocationHandler {
private Object proxyed;
public DynamicProxyHandler(Object proxyed) {
this.proxyed = proxyed;
}
@Override
public Object invoke(Object proxy?? Method method?? Object[] args) throws IllegalAccessException?? IllegalArgumentException?? InvocationTargetException {
System.out.println("?????????.");
return method.invoke(proxyed?? args);
}
}
??????????
public class Main {
public static void main(String[] args) {
RealObject real = new RealObject();
Interface proxy = (Interface) Proxy.newProxyInstance(
Interface.class.getClassLoader()?? new Class[] {Interface.class}??
new DynamicProxyHandler(real));
proxy.doSomething();
proxy.somethingElse("luoxn28");
}
}
?????????????£?

???????????Proxy???????Proxy.newProxyInstance()????????????????????????????????????????????????????????????б?(????????????)?????InvocationHandler????????????????????????е?????????????????????????????????????????????????”???”??????????????????????????????н???????????????????