※Class取得方式
System.out.println("1.使用Object物件的getClass()"); Class<? extends BigDecimal> c1 = BigDecimal.ZERO.getClass(); System.out.println(c1 + System.getProperty("line.separator")); System.out.println("2.使用.class"); Class<Integer> c2a = int.class; Class<Integer> c2b = Integer.class; System.out.println(c2a); System.out.println(c2b + System.getProperty("line.separator")); System.out.println("3.使用Class.forName()"); try { Class<?> c3 = Class.forName("java.util.List"); System.out.println(c3 + System.getProperty("line.separator")); } catch (ClassNotFoundException e) { e.printStackTrace(); } System.out.println("4.Wrapper類別才有的TYPE"); Class<Long> c4 = Long.TYPE; System.out.println(c4);
※結果:
1.使用Object物件的getClass()
class java.math.BigDecimal
2.使用.class
int
class java.lang.Integer
3.使用Class.forName()
interface java.util.List
4.Wrapper類別才有的TYPE
long
※第2種泛型裡只能是Wrapper類別,但都能分清楚
※第4種取得的是小寫的
※塞值的四種方式
package xxx.ooo; public class JavaBean { private int id; private String name; // setter/getter... }
※隨便寫一隻java bean
※四種方式
try { System.out.println("原本的方式"); JavaBean jb1 = new JavaBean(); jb1.setId(1); jb1.setName("George"); System.out.println(jb1.getId()); System.out.println(jb1.getName()); System.out.println(System.getProperty("line.separator") + "Java8的lambda方式"); Supplier<JavaBean> sup = () -> { return new JavaBean(); }; JavaBean jb2 = sup.get(); jb2.setId(2); jb2.setName("Mary"); System.out.println(jb2.getId()); System.out.println(jb2.getName()); System.out.println(System.getProperty("line.separator") + "Java8的引用方式"); Supplier<JavaBean> supp = JavaBean::new; JavaBean jb3 = supp.get(); jb3.setId(3); jb3.setName("借錢"); System.out.println(jb3.getId()); System.out.println(jb3.getName()); System.out.println(System.getProperty("line.separator") + "反射的方式"); Class<?> c3 = Class.forName("xxx.ooo.JavaBean"); JavaBean jb4 = (JavaBean) c3.newInstance(); jb4.setId(4); jb4.setName("免還"); System.out.println(jb4.getId()); System.out.println(jb4.getName()); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); }
※可以很順利的塞值,但反射的方式看不出來有用預設建構子,其實是有用到的,如在JavaBean增加一個建構子,如下:
※
public class JavaBean { private int id; private String name; public JavaBean(int id, String name) { this.id = id; this.name = name; } // setter/getter... }
※此時預設建構子就會消失,這時反射的方式在編譯時不會報錯,執行時會報「java.lang.NoSuchMethodException: xxx.ooo.JavaBean.<init>()」的錯,所以大部分寫java bean時都會要求一定要有預設建構子
※雖然沒有預設建構子,但反射還是能做到塞值的功能,如下:
※
try { System.out.println("原本的方式"); JavaBean jb1 = new JavaBean(1, "George"); System.out.println(jb1.getId()); System.out.println(jb1.getName()); System.out.println(System.getProperty("line.separator") + "Java8的lambda方式"); BiFunction<Integer, String, JavaBean> bf = (i, s) -> { return new JavaBean(i, s); }; JavaBean jb2 = bf.apply(2, "Mary"); System.out.println(jb2.getId()); System.out.println(jb2.getName()); System.out.println(System.getProperty("line.separator") + "Java8的引用方式"); BiFunction<Integer, String, JavaBean> bif = JavaBean::new; JavaBean jb3 = bif.apply(3, "借錢"); System.out.println(jb3.getId()); System.out.println(jb3.getName()); System.out.println(System.getProperty("line.separator") + "反射的方式"); Class<?> c3 = Class.forName("xxx.ooo.JavaBean"); // JavaBean jb4 = (JavaBean) c3.newInstance(); // jb4.setId(4); // jb4.setName("免還"); Constructor<?>[] conArray = c3.getConstructors(); JavaBean jb4 = null; try { jb4 = (JavaBean) conArray[0].newInstance(4, "免還"); } catch (IllegalArgumentException | InvocationTargetException e) { e.printStackTrace(); } System.out.println(jb4.getId()); System.out.println(jb4.getName()); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); }
※反射的方式要利用getConstructors()的方法就可以做到塞值
※不用 set 的塞值
這種方法可以在迴圈判斷方法名時加數字
Animal animal = new Animal();
Stream.of(animal.getClass().getDeclaredMethods()).forEach(m -> {
if (m.getName().equals("setName")) {
try {
m.invoke(animal, "monkey");
} catch (IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
}
});
System.out.println(animal.getName());
沒有留言:
張貼留言