1. 程式人生 > 實用技巧 >Saltsatck資料系統元件: Grains和 pillar

Saltsatck資料系統元件: Grains和 pillar

1.執行環境

jdk1.8.0_77 Intellij IDEA2018.3 x64

2.JAVA反射機制

Java 反射是Java語言的一個很重要的特徵,它使得Java具有了“動態性”。 Java提供了一套機制來動態獲取類的資訊以及動態呼叫物件的方法的功能,這套機制就叫——反射 反射機制是如今很多流行框架的實現基礎,其中包括Struts、Spring、Hibernate等。

在執行時判斷任意一個物件所屬的類。 在執行時構造任意一個類的物件。 在執行時判斷任意一個類所具有的成員變數和方法。 在執行時呼叫任意一個物件的方法

Reflection 是Java被視為動態(或準動態)語言的一個關鍵性質。這個機制允許程式在執行時透過Reflection APIs取得任何一個已知名稱的class的內部資訊,包括其modifiers(諸如public, static 等等)、superclass(例如Object)、實現之interfaces(例如Serializable),也包括fields和methods的所有資訊,並可於執行時改變fields內容或呼叫methods 那麼通過Reflection所獲取的資訊從什麼地方獲取呢?

3.獲取Class物件和方法

對於每一個類在載入時都會有一個唯一的Class物件,Class物件中包含了所有需要動態獲取的類的資訊, 所以Class類是Reflection API 中的核心類

方法

1)obj.getClass()

2)class屬性

3)Class.forName()

4)ClassLoader

4.Class中的常用方法(獲得類的資訊)

在Class物件的方法中,所有getXXX方法只能反射出public型別的成員,包括父類的public成員,所有getDeclaredXXX可以反射出類的所有成員(包括類的私有成員),但是隻限於類本身的成員

5.Class中的常用方法(獲得類的構造方法)

getConstructors():獲得類的所有的public型別的構造方法。

getDeclaredConstructors():獲得類所有的構造方法 。

getConstructor(Class[] parameterTypes):獲得類的特定public的構造方法, parameterTypes 引數指定構造方法的引數型別。

getDeclaredConstructor(Class[] parameterTypes):獲得類指定的所有的構造方法。

6.Class中的常用方法(獲得類的屬性)

getFields():獲得類的public型別的屬性。

getDeclaredFields():獲得類本身的所有屬性

getField(String):獲得指定名字的public型別的屬性物件

getDeclaredField(String)獲得類自己的指定名字的屬性物件

Field類: getModifiers():獲得屬性的修飾符(Modifier.toString(int)顯示對應的修飾符型別)

getType() : 獲得屬性的型別

7.Class中的常用方法(獲得類的方法)

getMethods():獲得類的public型別的方法。

getDeclaredMethods():獲得類的所有方法。

getMethod(String name, Class[] parameterTypes):獲得類的特定public的方法, name引數指定方法的名字, parameterTypes 引數指定方法的引數型別。

getDeclaredMethod(String name, Class[] parameterTypes) Method類:

getParameterTypes() :獲得方法的所有引數型別

getReturnType():獲得方法的返回值型別

8.程式碼展示

public class demo1 {
public static void main(String[] args) throws ClassNotFoundException{
//得到Class類物件的四種方法
//1.
Object obj=new String();
Class clz1 = obj.getClass();

//2.
Class clz2 = String.class;

//3.
Class clz3 = Class.forName("java.lang.String");

//4.
ClassLoader cl = ClassLoader.getSystemClassLoader();
Class clz4 = cl.loadClass("java.util.ArrayList");

}
}

public class demo2 {
public static void main(String[] args) throws SecurityException, NoSuchMethodException, IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException {
// 反射String類的所有構造方法
Class clz = Students.class;

System.out.println("所有構造方法");
// Constructor[] cons = clz.getConstructors();
Constructor[] cons = clz.getDeclaredConstructors();
for (Constructor con : cons) {
// System.out.println("訪問修飾許可權:" +
// Modifier.toString(con.getModifiers()));
// System.out.println("方法名:" + con.getName());
// System.out.println("****************************");
System.out.println(Modifier.toString(con.getModifiers()) + " "
+ con.getName());
}


//找無參的構造方法 Student s = new Student();
Constructor con = clz.getDeclaredConstructor();
Object obj = con.newInstance();
System.out.println(obj);

//找帶string,int型別引數的構造方法 Student s = new Student("zhangsan",12)
con = clz.getDeclaredConstructor(String.class, int.class);
obj = con.newInstance("zhangsan", 12);
System.out.println(obj);

con = clz.getDeclaredConstructor(String.class);

public class demo3 {
public static void main(String[] args) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException {
Class clz = Students.class;

System.out.println("得所有欄位:");
Field[] fields = clz.getDeclaredFields();
for(Field field : fields) {
System.out.println(Modifier.toString(field.getModifiers())+" " + field.getType().getSimpleName() + " " + field.getName());
}


//利用反射為s學生物件的兩個屬性欄位賦值
Students s = new Students(); //
Class clzz = s.getClass();

//為x欄位賦值
Field field_x = clzz.getField("x");
field_x.set(s, "hello");
System.out.println(s.x);

//得到name欄位
Field field_name = clzz.getDeclaredField("name");
field_name.setAccessible(true);
field_name.set(s, "zhangsan");
field_name.setAccessible(false);

Field field_age = clzz.getDeclaredField("age");
field_age.setAccessible(true);
field_age.set(s, 20);
field_age.setAccessible(false);
System.out.println(s);

public class demo4 {
public static void main(String[] args) throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException, InstantiationException {
Class clz = Students.class;

Method[] methods = clz.getDeclaredMethods();
for (Method method : methods) {
Class[] clzz = method.getParameterTypes();
String temp = "";
for(Class cz:clzz) {
temp += cz.getSimpleName()+",";
}

System.out.println(Modifier.toString(method.getModifiers()) + " "
+ method.getReturnType().getSimpleName() + " "
+ method.getName()+"("+temp+")");
}


//呼叫類無參的構造方法例項化物件
Students st = (Students)clz.newInstance();

//呼叫無參的構造方法例項化
// Student st = (Student)clz.getConstructor().newInstance();


//得到fun1方法並呼叫
Method method_fun1 = clz.getMethod("fun1", String.class, int.class);
method_fun1.invoke(st, "hello", 100);


Method method_fun2 = clz.getMethod("fun2", String.class, int.class, double.class);
Object returnValue = method_fun2.invoke(st, "hello",200, 3.14);
System.out.println(returnValue);


public class demo5 {
public static void main(String[] args) {
Dog dog = new Dog();

String propertyName = "age";
int propertyValue = 12;

setProperty(dog, propertyName, propertyValue);

System.out.println(dog);
}

/**
*
* @param obj
* ,要設定欄位值的物件
* @param propertyName
* ,要設定的欄位名
* @param propertyValue
* ,要設定的欄位值
*/
public static void setProperty(Object obj, String propertyName,
Object propertyValue) {
// 得到類物件
Class clz = obj.getClass();
// 得到欄位
Field field;
try {
field = clz.getDeclaredField(propertyName);
// 根據欄位名得到對應的set方法名
String methodName = "set"
+ propertyName.substring(0, 1).toUpperCase()
+ propertyName.substring(1);

Method method = clz.getMethod(methodName, field.getType());
method.invoke(obj, propertyValue);

} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}


9.心得

學習沒有捷徑,也不是你奮鬥一天能完成的事情,而是你端正學習態度,一點點累積而成,所謂活到老學到老,

如果一件事情有盡頭,那做這件事情的人就沒有高低可分,最高點的人都是平等的,

但學習不一樣,好比程式設計,你只能沒有好和最好,只有更好