java基礎(chǔ)(一)反射注解泛型

  • 反射

public class IocBean {
    private String name;
    public String title = "ioc";
    private static Login login = new Login();
    public IocBean(){

    }

    private IocBean(String name){
        this.name = name;
    }

    private void print(){
        LogUtils.LogE("name = "+this.name);
    }

    private void printName(String name1){
        LogUtils.LogE("name1 = "+name1);
    }

    @Override
    public String toString() {
        return "IocBean{" +
                "name='" + name + '\'' +
                '}';
    }
}
  • 1.反射拿到構(gòu)造函數(shù)
         Class<?> clazz = IocBean.class;
        try {
            //拿到公有的構(gòu)造
            Constructor<?> constructor1 = clazz.getConstructor();
            //拿到私有的構(gòu)造
            Constructor<?> constructor = clazz.getDeclaredConstructor(String.class);
        } catch (NoSuchMethodException e) {
            LogUtils.LogE(e.toString());
        }
  • 2.通過(guò)構(gòu)造去創(chuàng)建對(duì)象
        //拿到公有的構(gòu)造
        Constructor<?> constructor1 = clazz.getConstructor();
        //拿到私有的構(gòu)造
         Constructor<?> constructor = clazz.getDeclaredConstructor(String.class);
        //有參
         IocBean instance = (IocBean) constructor.newInstance("digta");
         //無(wú)參
         IocBean instance1 = (IocBean) constructor1.newInstance();
  • 3.反射獲取屬性修改屬性
        //拿公有屬性
         Field field = clazz.getField("title");
         String title = (String) field.get(instance);
        //修改屬性
         field.set(instance,"update title");
         //拿私有屬性
         Field field1 = clazz.getDeclaredField("name");
         field1.setAccessible(true);
         String name = (String) field1.get(instance); 
         field1.set(instance,"update name");
         //獲取靜態(tài)屬性
         Field field2 = clazz.getDeclaredField("login");
         field2.setAccessible(true);
         Login login = (Login) field2.get(null);     
  • 4.反射執(zhí)行私有方法
  //反射執(zhí)行方法
            Method method = clazz.getDeclaredMethod("print");
            method.setAccessible(true);
            method.invoke(instance);
            
            Method method1 = clazz.getDeclaredMethod("printName",String.class);
            method1.setAccessible(true);
            method1.invoke(instance,"methodName");
  • 注解

  • 1.RetentionPolicy.SOURCE:注解只保留在源文件,當(dāng)Java文件編譯成class文件的時(shí)候,注解被遺棄;
  • 2.RetentionPolicy.CLASS:注解被保留到class文件,但jvm加載class文件時(shí)候被遺棄,這是默認(rèn)的生命周期;
  • 3.RetentionPolicy.RUNTIME:注解不僅被保存到class文件中,jvm加載class文件之后,仍然存在;

這3個(gè)生命周期分別對(duì)應(yīng)于:Java源文件(.java文件) ---> .class文件 ---> 內(nèi)存中的字節(jié)碼。
一般如果需要在運(yùn)行時(shí)去動(dòng)態(tài)獲取注解信息,那只能用 RUNTIME 注解;如果要在編譯時(shí)進(jìn)行一些預(yù)處理操作,比如生成一些輔助代碼(如 ButterKnife),就用 CLASS注解;如果只是做一些檢查性的操作,比如 @Override 和 @SuppressWarnings,則可選用 SOURCE 注解.

  • 1.@Target(ElementType.TYPE) //接口、類(lèi)、枚舉
  • 2.@Target(ElementType.FIELD) //字段、枚舉的常量
  • 3.@Target(ElementType.METHOD) //方法
  • 4.@Target(ElementType.PARAMETER) //方法參數(shù)
  • 5.@Target(ElementType.CONSTRUCTOR) //構(gòu)造函數(shù)
  • 6.@Target(ElementType.LOCAL_VARIABLE)//局部變量
  • 7.@Target(ElementType.ANNOTATION_TYPE)//注解
  • 8.@Target(ElementType.PACKAGE) ///包
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface ViewId {
    int value();
}
    @ViewId(R.id.tv_ioc)
    private TextView mTextView;
    @ViewId(R.id.tv_ioc1)
    private TextView mTextView1;
    @Override
    protected void initView(View rootView) {
        //test1();
        InjectUtils.inject(this,rootView);
        mTextView.setText("ioc set hello");
        mTextView1.setText("ioc set1 hello1");
    }

    public static void inject(IocFragment iocFragment, View rootView) {
        Class<?> aClass = iocFragment.getClass();
        Field[] fields = aClass.getDeclaredFields();

        LogUtils.LogE(fields.length);
        for (Field field : fields) {
            ViewId annotation = field.getAnnotation(ViewId.class);
            if (annotation != null) {
                int value = annotation.value();
                View view = rootView.findViewById(value);
                field.setAccessible(true);
                try {
                    field.set(iocFragment,view);
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
        }
    }
  • 泛型

    1. ? extends E 規(guī)定上邊界
//必須是Activity或它的子類(lèi)
 public static void startActivity(Context context, Class<? extends Activity> clazz){
        context.startActivity(new Intent(context,clazz));
    }
    1. ? super E 規(guī)定下邊界
//必須是BaseActivity或者它的父類(lèi)
  public static void startActivity(Context context, Class<? super BaseActivity> clazz){
        context.startActivity(new Intent(context,clazz));
    }
    List<? extends Person> list = new ArrayList<>();
    //這里會(huì)報(bào)錯(cuò),因?yàn)镻erson的子類(lèi)有很多種,list無(wú)法確定是哪一種,這里只能用get方法取值,得到的都是Person
    list.add(new Person());
    Person person = list.get(0);

    List<? super Person> list = new ArrayList<>();
   //這樣寫(xiě)不會(huì)報(bào)錯(cuò),list將所有元素都當(dāng)做是Person加入
    list.add(new Person());
  • 3.方法泛型
//作用于方法上, 省去強(qiáng)轉(zhuǎn)的麻煩
  public <T> T getView(View view,int id){
        return (T)view.findViewById(id);
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 關(guān)于注解首先引入官方文檔的一句話:Java 注解用于為 Java 代碼提供元數(shù)據(jù)。作為元數(shù)據(jù),注解不直接影響你的代...
    編程小世界閱讀 539評(píng)論 0 0
  • 什么是注解(Annotation):Annotation(注解)就是Java提供了一種元程序中的元素關(guān)聯(lián)任何信息和...
    九尾喵的薛定諤閱讀 3,425評(píng)論 0 2
  • 前言,本來(lái)只是想研究一下注解的,不過(guò)發(fā)現(xiàn),要懂注解先得懂反射,別問(wèn)我為什么,你可以自己試試 JAVA反射 主要是指...
    justCode_閱讀 1,279評(píng)論 2 9
  • 注解的概念 注解(Annotation),也叫元數(shù)據(jù)(Metadata),是Java5的新特性,JDK5引入了Me...
    啦啦啦啦啦哈1閱讀 206評(píng)論 0 0
  • 夯實(shí) Java 基礎(chǔ) - 注解 不知道大家有沒(méi)有一種感覺(jué),當(dāng)你想要了解某個(gè)知識(shí)點(diǎn)的時(shí)候,就會(huì)發(fā)現(xiàn)好多技術(shù)類(lèi) APP...
    醒著的碼者閱讀 1,146評(píng)論 4 7

友情鏈接更多精彩內(nèi)容