類的認識
package com.cn.reflect;public class demo {/*** 測試類CLass* @param args*/public static void main(String[] args) {FZS f1=new FZS();System.out.PRintln(f1.getClass());//方式1取得類名Class c1=f1.getClass();System.out.println(c1);//方式二,每個類含有一個隱含的成員變量.class,稱為類類型Class c2=FZS.class;System.out.println(c2);//方式三,獲取類類型,需要輸入全名,會出現異常Class c3=null;try {c3=Class.forName("com.cn.reflect.FZS");System.out.println(c3);} catch (ClassNotFoundException e) {e.printStackTrace();}System.out.println(c1==c2);System.out.println(c1==c3);//可以使用類類型獲取類實例try {FZS f2=(FZS) c1.newInstance();f2.print();} catch (InstantiationException | IllegalaccessException e) {e.printStackTrace();}}}class FZS{public void print(){System.out.println("test class ");}}
2.靜態加載類
class Office {/**靜態加載*/public static void main(String[] args) {/*new 創建對象,靜態加載所有可能用到的類*/if("Word".equals(args[0])){Word w=new Word();w.start();}if("Excel".equals(args[0])){Excel e=new Excel();e.start();}}}
class Word {public static void main(String[] args) {}public void start(){System.out.println("靜態類加載測試");}}
3.動態加載類
/**動態加載類*/class OfficeBetter {public static void main(String[] args) {try{//動態加載類,在運行時刻加載Class c=Class.forName(args[0]);//通過類類型,創建該類對象OfficeAble oa=(OfficeAble)c.newInstance();oa.start();}catch (Exception e){e.printStackTrace();}}}
/**接口*/interface OfficeAble{public void start();}
class Word2 implements OfficeAble {public void start(){System.out.println("Word start!!");}}
4.簡單封裝,獲取類信息
package com.cn.reflect;import java.lang.reflect.Constructor;import java.lang.reflect.Field;import java.lang.reflect.Method;public class ClassUtil {public static void printMethodMessage(Object obj){Class c=obj.getClass();Method[] ms= c.getMethods();for(Method s:ms){System.out.print("方法名是:"+s.getReturnType()+" "+s.getName()+"(");Class[] parameters=s.getParameterTypes();for(Class p:parameters){System.out.print(p.getName()+" ");}System.out.println(");");} }private static void printFieldMethod(Object obj) {Class c=obj.getClass();/*** 成員變量是也是對象* java.lang.reflect.Field* Field類封裝了關于成員變量的操作* getField*/Field[] fs=c.getDeclaredFields();for(Field f:fs){//Class fieldType=f.getType();String typeName=fieldType.getName();String typeName2=fieldType.getTypeName();System.out.println(f.getClass()+"--" +f.getName()+" --"+fieldType+"-- "+typeName+" --"+typeName2);}}public static void printConstructorMethod(Object obj){Class c=obj.getClass();/*** 構造函數也是對象* java.lang.Constructor 封裝了構造函數的信息* */Constructor[]cons=c.getDeclaredConstructors();for(Constructor con:cons){//獲取構造函數名System.out.print(con.getName()+"( ");//獲取構造函數參數名列表Class[] paramters=con.getParameterTypes();for (Class class1 : paramters) {System.out.print(class1.getName()+ ",");}System.out.println(");");}}}
package com.cn.reflect;public class demo3 {public static void main(String[] args) {String s="煩煩煩";ClassUtil.printMethodMessage(s);Integer a=1;ClassUtil.printConstructorMethod(a);ClassUtil.printConstructorMethod(1);ClassUtil.printConstructorMethod("a");ClassUtil.printConstructorMethod(1);}}
5.反射及其用法
package com.cn.reflect;
import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;/** * 反射測試 * @author fzs * */public class demo5 {public static void main(String[] args) {A a=new A();Class c=a.getClass();/*** 2.獲取方法,名稱,參數列表* get*/try {//Method m=c.getMethod("print", new Class[]{int.class,int.class})Method m=c.getMethod("print",int.class,int.class);//方法中如果沒有返回值返回null,有返回值返回具體的返回值//Object o=m.invoke(a,new Object[]{10,20});Object o=m.invoke(a,10,20);System.out.println("=================================");m=c.getMethod("print",String.class,String.class);o=m.invoke(a, "FENGZHENGSHU","fengzhengyun");System.out.println("=================================");} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}}class A{public void print(int a,int b){System.out.println(a+b);}public void print(String a,String b){System.out.println(a.toLowerCase()+","+b.toUpperCase());}}
6.反射解析泛型函數本質
package com.cn.reflect;import java.lang.reflect.Method;import java.util.ArrayList;public class demo6 {public static void main(String[] args) {ArrayList list1=new ArrayList();ArrayList<String> list2=new ArrayList<String>();list2.add("fzs");//list2.add(2);編譯前防錯Class c1=list1.getClass();Class c2=list2.getClass();System.out.println(list2);System.out.println(c1==c2);/*** 使用反射繞過編譯*/try {//Method m=c2.getMethod("add", int.class);Method m=c2.getMethod("add", Object.class);Object obj=m.invoke(list2, 20);System.out.println(list2);} catch (Exception e) {e.printStackTrace();}}}
新聞熱點
疑難解答