1. 程式人生 > 實用技巧 >LeetCode 77. 組合

LeetCode 77. 組合

內建註解:

@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
                    */
            }
        }
    }
}