关于接口的动态实现

huqiao6163111 2012-08-08 10:50:20
//反射获取NumberPicker类的内部接口类
Class numberPicker_OnChangedListener=Class.forName("android.widget.NumberPicker$OnChangedListener");
//反射获取NumberPicker方法set接口事件的方法
Method setOnChangeListenerMethod =numberPicker.getMethod("setOnChangeListener", numberPicker_OnChangedListener);

final Field datePicker_mYear=DatePicker.class.getDeclaredField("mYear");
datePicker_mYear.setAccessible(true);

final Method datePicker_adjustMaxDay=DatePicker.class.getDeclaredMethod("adjustMaxDay");
final Method datePicker_notifyDateChanged=DatePicker.class.getDeclaredMethod("notifyDateChanged");
final Method datePicker_updateDaySpinner=DatePicker.class.getDeclaredMethod("updateDaySpinner");
datePicker_adjustMaxDay.setAccessible(true);
datePicker_notifyDateChanged.setAccessible(true);
datePicker_updateDaySpinner.setAccessible(true);

//调用反射获取的set接口事件的方法,但是这边会有问题的new OnChangedListener()是我写的自己接口,我想强转
//成为NumberPicker类的内部接口类 有什么方法吗,NumberPicker这个类是手机自带的代码,和我引入的代码jar包 //无关,有什么方法能动态创建numberPicker_OnChangedListener的一个实现类吗
setOnChangeListenerMethod.invoke(fatherDatePicker, new OnChangedListener(){
@Override
public void onChanged(Object picker, int oldVal, int newVal)
{
// TODO Auto-generated method stub
if(newVal<Calendar.getInstance().get(Calendar.YEAR)){
try
{
// Adjust max day for leap years if needed
// fatherDatePicker.adjustMaxDay();
// fatherDatePicker.notifyDateChanged();
// fatherDatePicker.updateDaySpinner();
datePicker_mYear.set(fatherDatePicker, newVal);
datePicker_adjustMaxDay.invoke(fatherDatePicker);
datePicker_notifyDateChanged.invoke(fatherDatePicker);
datePicker_updateDaySpinner.invoke(fatherDatePicker);
}
catch (IllegalArgumentException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (IllegalAccessException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (InvocationTargetException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}

}
}

} );
...全文
112 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
ArayChou 2012-08-08
  • 打赏
  • 举报
回复
用程序动态生成一个接口的实现类?貌似反射不能干这个.

另外,我很好奇"正常的通过import、implements实现一个类方式"为什么不可能,貌似没有这种情况.

如果你非要在程序运行的时候,动态的来实现一个类,我觉得只有一个办法: 在程序运行的过程中生成一个java文件,编译它,在用反射来使用它.

但是,我想,楼主显然不想这么整....
huqiao6163111 2012-08-08
  • 打赏
  • 举报
回复
具体意思就是想通过反射拿到接口,然后想办法构造一个接口的实现类(我也想不出什么办法了,这个接口在手机中自带框架代码里,给我们开发的jar包不包含,正常的通过import、implements实现一个类方式就不可能了,反射获取一大堆东西搞得像破解软件似的,现在到这一步真心蛋疼不知道怎么转换实现了,谁知道这个接口怎么做出一个实现类啊)
huqiao6163111 2012-08-08
  • 打赏
  • 举报
回复
说实话,这个是android手机的软件代码,感觉android他把他的开发包导一部分代码打成jar包,另外一部分类交给手机开发商定制自己的类,说实话我也不太清楚,反正跑起来不会报错,另外的一些类都在手机里面自带了吧,反编译源代码,引用发现找不到那个类,我相信如果写了import、报错也能打成apk放到手机和手机一起跑应该不会有问题的,但是eclipise编译不通过...,

不过你提了一个好建议,写一个如果能编译一个实现类的class文件,每次打包塞到apk中去....或者塞到jar包中去(定制android.jar咕~~(╯﹏╰)O(∩_∩)O哈哈~),想想而已..
如果知道class怎么通过代码定义、创建、生成....

51,409

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧