LeetCode 77. 組合
阿新 • • 發佈:2020-09-08
內建註解:
@Override //表示重寫超類的方法
@Deprecated //表示不推薦使用或過時,但可以使用
@SuppressWarnings("all") //用來抑制編譯時的所有警告
@SuppressWarnings("unchecked") //未檢查的警告
@SuppressWarnings(value={"unchecked","deprecation"}) //多個警告型別
元註解:
/*下面是定義一個註解的操作*/ @Target(value = {ElementType.METHOD,ElementType.TYPE}) //該註解能在哪些地方使用,可傳遞多個引數 @Retention(value = RetentionPolicy.RUNTIME) //表示註解生效位置RUNTIME>CLASS>RESOURCES @Documented //表示是否將我們的註解生成在javadoc中 @Inherited //子類可繼承父類的註解 @interface MyAnotation{ //自定義的註解 }
自定義註解:
@Target({ElementType.TYPE,ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @interface MyAnotaion{ //註解的引數 :引數型別 + 引數名(); String name() default ""; //值預設為空int id() default -1; //如果預設為-1代表不存在 String[] schools() default {"南京大學","天津大學"}; } //如果註解內部引數只有一個,那麼可以直接引數型別+value() //如:String value(); //使用註解設定值時可以不用鍵:@MyAnotation("張三")。不然只能這樣: //@MyAnotaion(name="張三",age=18)設定值;
反射:
public void test(){ //獲取系統類載入器 ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader(); System.out.println("系統類載入器:" + systemClassLoader); //獲取系統類載入器:拓展類載入器: ClassLoader parent = systemClassLoader.getParent(); System.out.println("拓展類載入器:" + parent); //獲取拓展類載入器:根載入器 ClassLoader parent1 = parent.getParent(); System.out.println("根載入器" + parent1); //測試當前類是哪個載入器載入的 Class<ClassLoaderDemoTest> classLoaderDemoTestClass = ClassLoaderDemoTest.class; System.out.println("當前類是:"+classLoaderDemoTestClass.getClassLoader()+"載入的"); }
輸出:
獲取類執行時結構:
public void Test() throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException { Class<?> aClass = Class.forName("pojo.User"); System.out.println(aClass.getName()); //獲取包名加類名 System.out.println(aClass.getSimpleName()); //獲取類名 Field[] fields = aClass.getFields(); //獲取類所有公開屬性名 Field[] declaredFields = aClass.getDeclaredFields(); //獲取類所有屬性 System.out.println(aClass.getDeclaredField("username")); //獲取指定屬性 Method[] methods = aClass.getMethods(); //獲取本類與父類所有公開方法 Method[] declaredMethods = aClass.getDeclaredMethods(); //獲取本類所有方法 Method getId = aClass.getDeclaredMethod("setId",int.class); //獲取指定方法 Constructor<?>[] constructors = aClass.getConstructors(); //獲取所有公共構造器 Constructor<?>[] declaredConstructors = aClass.getDeclaredConstructors(); //獲取所有構造器 Constructor<?> declaredConstructor = aClass.getDeclaredConstructor(int.class,String.class,String.class,String.class,String.class); //獲取指定構造器 System.out.println(declaredConstructor); }
動態建立物件,執行方法:
public void test1() throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException { Class<?> aClass = Class.forName("pojo.Student"); Student student = (Student)aClass.newInstance(); //構造一個物件,本質呼叫無參構造 Constructor<?> declaredConstructor = aClass.getDeclaredConstructor(String.class, int.class); //獲取一個有參構造器 Object wmskywm = declaredConstructor.newInstance("wmskywm", 18);//構造一個物件 Student student1 = (Student) aClass.newInstance(); Method setSname = aClass.getDeclaredMethod("show"); //反射拿到一個類的方法 setSname.invoke(student1,"wangming"); //啟用方法設定student1的值 System.out.println(student1); //輸出Student(sname=wangming, sage=0) Field sname = aClass.getDeclaredField("sname"); sname.setAccessible(true); //不能直接操作公共方法,需要關閉安全檢測 sname.set(student1,"小明"); System.out.println(student1); }
效能對比:
普通呼叫方法 > 關掉安全檢測使用反射 > 使用反射
反射操作泛型例子:
public class TestDemo1 { private Map<String,User> map; public void test01(Map<String, User> userMap, List<User> userList) { System.out.println("test01"); } public Map<String,User> test02(){ System.out.println("test02"); return null; } @Test public void test03() throws NoSuchMethodException, NoSuchFieldException { /*獲取方法引數型別的泛型*/ Method test01 = TestDemo1.class.getDeclaredMethod("test01", Map.class, List.class); //獲取TestDemo01反射Class中的test01方法 Type[] genericParameterTypes = test01.getGenericParameterTypes(); //獲取方法中的引數 for (Type genericParameterType : genericParameterTypes) { //遍歷引數 System.out.println("#"+genericParameterType); /*輸出 #java.util.Map<java.lang.String, pojo.User> #java.util.List<pojo.User> */ if(genericParameterType instanceof ParameterizedType){ Type[] actualTypeArguments = ((ParameterizedType) genericParameterType).getActualTypeArguments(); //獲取引數的泛型 for (Type actualTypeArgument : actualTypeArguments) { //遍歷引數中的泛型 System.out.println("#"+actualTypeArgument); /*輸出: #java.util.Map<java.lang.String, pojo.User> #class java.lang.String#class pojo.User #java.util.List<pojo.User> #class pojo.User */ } } } /*獲取方法返回型別的泛型*/ Method test02 = TestDemo1.class.getDeclaredMethod("test02", null); //獲取TestDemo01反射Class中的test02方法 Type genericReturnType = test02.getGenericReturnType(); //獲取返回test02方法的引數型別 if(genericReturnType instanceof ParameterizedType){ Type[] actualTypeArguments = ((ParameterizedType) genericReturnType).getActualTypeArguments(); //獲取引數的泛型 for (Type actualTypeArgument : actualTypeArguments) { //遍歷引數中的泛型 System.out.println("#"+actualTypeArgument); /*輸出: #class java.lang.String #class pojo.User */ } } /*獲取類屬性泛型*/ Field map = TestDemo1.class.getDeclaredField("map"); Type genericType = map.getGenericType(); System.out.println(genericType); if(genericType instanceof ParameterizedType){ Type[] actualTypeArguments = ((ParameterizedType) genericType).getActualTypeArguments(); //獲取引數的泛型 for (Type actualTypeArgument : actualTypeArguments) { //遍歷引數中的泛型 System.out.println("#"+actualTypeArgument); /*輸出: #class java.lang.String #class pojo.User */ } } } }