Jet- 比ButterKnife还好用的 类属性和方法绑定库;

Jet

极简轻量的标签注解库,总共才28K;

Git 地址:

https://github.com/gybin02/Jet/

功能

使用注解功能 来实现去除一些重复的模板代码,让Code更简单;

比如 类似 butterknife功能; 自动初始化Field和Method

命名来自 WordPress的Jetpack;


每个注解做的事情要很简单,符合kiss原则

已完成

@JFindView([ViewId])

运行时注入,支持 自动初始化 View的findViewById

@JFindViewOnClick([ViewId])

支持 自动初始化View的 findViewById 和 onClick

Activity 需要 implement View.OnClickListener.class;

@JIntent([key])

使用Annotation Runtime实现getIntent功能来读取Intent里面的数据;

支持自动从 Intent 里取值,比如Intent.getStringExtra([String]) 等

支持的参数类型具体如下(包括默认值)

           return intent.getStringExtra(value)

           return intent.getCharExtra(value, '\0');
           
           return intent.getCharExtra(value, '\0');

            return intent.getByteExtra(value, (byte) 0);
   
            return intent.getShortExtra(value, (short) 0);
 
            return intent.getIntExtra(value, 0);

            return intent.getLongExtra(value, 0);
        
   
            return intent.getFloatExtra(value, 0);
        

            return intent.getDoubleExtra(value, 0);

            return intent.getBooleanExtra(value, false);

            return intent.getSerializableExtra(value);
     
            return intent.getBundleExtra(value);

            return intent.getStringArrayExtra(value);
            
            return intent.getStringExtra(value);

使用例子

    //原来代码 
   public class DemoActivity implement View.OnClickListener{
     //Android 代码

      private String testString;
      private boolean testBoolean;
      private int testInt;
      private long testLong;
    
      private Button btnHello;
      private Button btn_test;
    

      //用值
      public void onCreate(Bundle savedInstanceState){
         super.onCreate(savedInstanceState);
        //Intent 初始化
          Intent intent = getIntent();
          testString = intent.getIntExtra("testString", 0);
          testInt = intent.getStringExtra("testInt");
          testBoolean = intent.getStirngExtra("testBoolean");
          testLong = intent.getBooleanExtra("testLong");
         
         //View  初始化
        btnHello= findViewById(R.layout.btn_hello);
        btn_test= findViewById(R.layout.btn_test);
        btnHello.setOnClick(this);
        Log.i("old",test1);
      }
      
      public void onClick(View v){
          int id= v.getId;
          if(id== hello_world){
            //TODO Do Something
          }
      }

      //TODO:如果需要取参的越来越多,代码会是什么样的呢?逻辑上是不是很复杂

使用 Jet注解实现:

    @JIntent("testString")
    private String testString;
    @JIntent("testBoolean")
    private boolean testBoolean;
    @JIntent("testInt")
    private int testInt;
    @JIntent("testLong")
    private long testLong;
    
    @JFindViwOnClick("btn_hello")
    private Button btnHello;
    @JFindViw("btn_test")
    private Button btn_test;
      
      //用值
      public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        //初始化后,既可使用所有属性
        Jet.init(this);
      }
      
      public void onClick(View v){
          int id= v.getId;
          if(id== hello_world){
            //TODO Do Something
          }
      }

NON-ACTIVITY BINDING

You can also perform binding on arbitrary objects by supplying your own view root.

你可以任意绑定对象,只要你提供一个View Root;

public class FancyFragment extends Fragment {
  @JFindView(R.id.button1) Button button1;
  @JFindView(R.id.button2) Button button2;

  @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fancy_fragment, container, false);
    Jet.bind(this, view);
    // TODO Use fields...
    return view;
  }
}

Another use is simplifying the view holder pattern inside of a list adapter.

public class MyAdapter extends BaseAdapter {
  @Override public View getView(int position, View view, ViewGroup parent) {
    ViewHolder holder;
    if (view != null) {
      holder = (ViewHolder) view.getTag();
    } else {
      view = inflater.inflate(R.layout.whatever, parent, false);
      holder = new ViewHolder(view);
      view.setTag(holder);
    }

    holder.name.setText("John Doe");
    // etc...

    return view;
  }

  static class ViewHolder {
    @JFindView(R.id.title) TextView name;
    @JFindView(R.id.job_title) TextView jobTitle;

    public ViewHolder(View view) {
      Jet.bind(this, view);
    }
  }
}
You can see this implementation in action in the provided sample.


@JImplement

实现 根据接口类,自动调用实现类功能,类似Summer功能 比Summer简单;只需要一个注释,可以用于跨module功能调用,但是不仅于此 更多功能可以自己发掘;;使用Java 动态代理实现;2017.05.23 finish

使用方法:

接口类

@JImplement("com.seeker.tony.myapplication.proxy.TestImpl")
public interface ITest {
    public void  test();
    
    public String getValue();
}

实现类:

//@JProvider 可有可无,只是用来标识实现类,避免被认为是无功能调用被删掉;
@JProvider
public class TestImpl {

    private static final String TAG = "TestImpl";

    public void test() {
        Log.d(TAG, "test Method  invoke");
    }

    public String getValue() {
        String str = "HelloWorld";
        Log.d(TAG, "getValue Method  invoke: " + str);
        return str;
    }
}

调用方法:

                    ITest iTest = JetProxy.getInstance().create(ITest.class);
                    iTest.test();
                    iTest.getValue();

Download

dependencies {
   //内部使用
   //compile 'com.meiyou.framework:jet:0.0.7-SNAPSHOT'
   compile 'com.meiyou.framework:jet:1.0.0'

}

Snapshots of the development version are available in Sonatype's snapshots repository.

待实现,

待实现区域,列了一些我想到的通用功能, 但是项目里面肯定还存在很多通用的功能;欢迎 各位 提Issue,让项目更强大;

  • @JTrycatch

AspectJ来实现
安全调用方法:给方法 自动加入 try Catch ;

已经实现,参考: Jet-AOP 工程;

常见问题

  • 性能测试;O(1)方法,20个@JFindView 属性初始化,耗时50ms;比直接FindViewById多花5ms,性能损耗基本可以忽略;
  • Fragment实现; 已经支持 2017.0525
  • ViewHolder实现; 已经支持 2017.0525
  • 运行时注入,可以改为 编译时注入
  • 有些注解实现 需要使用AOP技术;可以参考[Jet-AOP](http://git.meiyou.im/Android/JetAop) 工程;

后记:

  • 后面会对怎么实现写几篇文章;
  • Annotation的使用还有很多地方还可以继续优化;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容