所有的技術實現的目標只有一點:重用性
java.lang.Object
public final Class> getClass(); 根據實例化對象找到對象的所屬類型
java.lang.Class
public final class Class
getName():String:獲得該類型的全稱名稱。
getSuperClass():Class:獲得該類型的直接父類,如果該類型沒有直接父類,那麼返回null。
getInterfaces():Class[]:獲得該類型實現的所有接口。
isArray():boolean:判斷該類型是否是數組。
isEnum():boolean:判斷該類型是否是枚舉類型。
isInterface():boolean:判斷該類型是否是接口。
isPrimitive():boolean:判斷該類型是否是基本類型,即是否是int,boolean,double等等。
isAssignableFrom(Classcls):boolean:判斷這個類型是否是類型cls的父(祖先)類或父(祖先)接口。
getComponentType():Class:如果該類型是一個數組,那麼返回該數組的組件類型。
此外還可以進行類型轉換這類的操作,主要方法有:
asSubclass(Class clazz):Class:將這個類型
1.【Object類支持】Object類可以根據實例化對象獲取Class對象,必須實例化對象才能獲得
2.【jvm直接支持】採用類.class形式實例化,必須要導入開發包
3.【Class類支持】Class.forName(String className)
在Java中表示一個特定類型的類型類可以用“類型.class”的方式獲得
實例化的預選房:
jdk1.9之前
public T newInstance() throws Exception 代替了關鍵字new
jdk1.9之後
clazz.getDeclaredConstructor().newInstance()
工廠設計模式:
class Factory{
private Factory(){};
@SuppressWarnings("unchecked")
public static
T instance = null;
try {
instance = (T)Class.forName(className).newInstance();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return instance;
}
}
單利設計模式:Spring Runtime
1、volatile保證了uniqueInstance的修改對各個線程的可見性。
2、這是個static方法synchronized(this)肯定是不行的,因為沒有this。再說synchronized(uniqueInstance),synchronized是針對對象而言的,對象都是堆裡的對象,但是初始化狀態下uniqueInstance是null,只是棧裡的一個標識,在堆裡沒有。我試了一下synchronized(null)會報空指針異常。
1. public class Singleton {
2. private volatile static Singleton singleton;
3. private Singleton (){}
4. public static Singleton getSingleton() {
5. if (singleton == null) {
6. synchronized (Singleton.class) {
7. if (singleton == null) {
8. singleton = new Singleton();
9. }
10. }
11. }
12. return singleton;
13. }
14. }
獲取類結構信息:
獲得包名稱:public Package getPackage();
獲取繼承父類:public Class super T>getSupercalss();
獲取父接口:public Class>[] getInterfaces()
java.lang.Object
java.lang.Class
反射調用構造方法
實例化方法會替代:clazz.getDeclaredConstrutor().newInstasnce();
Declared表示本類
獲取所有所有方法:public Constructor>[] getDeclaredConstructors()
throws SecurityException
獲取指定構造方法:public Constructor
throws NoSuchMethodException,
SecurityException
獲取所有構造方法:public Constructor>[] getConstructors()
throws SecurityException
獲取指定構造方法:public Constructor
throws NoSuchMethodException,
SecurityException
java.lang.Object
java.lang.reflect.AccessibleObject
java.lang.reflect.Executable
java.lang.reflect.Constructor
反射調用普通方法
Class類裡提供如下操作可以獲取方法對象:
-獲取全部方法:public Method[] getMethods()
throws SecurityException
-獲取指定方法:public Method getMethod(String name,
Class>... parameterTypes)
throws NoSuchMethodException,
SecurityException
-獲取本類全部方法:public Method[] getDeclaredMethods()
throws SecurityException
-獲取本來指定方法:public Method getDeclaredMethod(String name,
Class>... parameterTypes)
throws NoSuchMethodException,
SecurityException
java.lang.Object
java.lang.reflect.AccessibleObject
java.lang.reflect.Executable
java.lang.reflect.Method
public Object invoke(Object obj,
Object... args)
throws IllegalAccessException,
IllegalArgumentException,
InvocationTargetException


反射調用成員
獲取本類全部成員:public Field[] getDeclaredFields()
throws SecurityException
獲取本類指定成員:public Field getDeclaredField(String name)
throws NoSuchFieldException,
SecurityException
獲取全部成員:public Field[] getFields()
throws SecurityException
獲取指定成員:public Field getField(String name)
throws NoSuchFieldException,
SecurityException
java.lang.Object
java.lang.reflect.AccessibleObject
java.lang.reflect.Field
void
public void set(Object obj,
Object value)
throws IllegalArgumentException,
IllegalAccessException
public Object get(Object obj)
throws IllegalArgumentException,
IllegalAccessException
public void setAccessible(boolean flag)
throws SecurityException
public Class>getType() .getName() .getSimpleName()
Unsafe
sun.musc.Unsafe
private Unsafe() {}
private static final Unsafe() theUnsafe = new Unsafe();
Field field = Unsafe.class.getDeclaredField("theUnsafe");
filed.setAccessible(true);
Unsafe unsafeObject = (Unsafe) field.get(null);//static 屬性不需要傳遞實例化對象
閱讀更多 攻防基地 的文章