Android开发之反射与注解

Android开发中,自定义注解的两种应用方式 1.基于反射使用注解首先我们的目标是制作一个用户信息表,是一个User对象,表中有其对应的属性,将注解和属性等关联,然后再通过反射拿到对应的注解值和属性值打印,思路如下:1.1. 首先定义两个注解UserAnnotation和UserAttribute,创建一个注解遵循: public @interface 注解名 {方法参数}1.2. 将注解和User对象关联给用户赋值。1.3. 获取注解,打印注解的注解值和属性值。定义注解代码如下将注解和User对象绑定主要通过获取注解打印。 阅读详情

反射

类类型Class的使用

类类型Class的实例获取方式有一下三种

public static void main(String[] arg0) {
        String result = "Hello ReflectionText..";
        System.out.println(result);

        Class userClass1 = User.class;

        Class userClass2 = new User().getClass();

        try {
            Class userClass3 = Class
                    .forName("idea.analyzesystem.reflection.User");

            System.out.println(userClass1);
            System.out.println(userClass2);
            System.out.println(userClass3);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

    }

我们可以通过类类型创建类实例对象(这里newInstance要求该类必须拥有无参构造函数)

public static void main(String[] arg0) {

        try {
            User user = User.class.newInstance();
            System.out.println(user);
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }
动态加载类

类的加载方式分为动态加载和静态加载,而上面提到的Class.format(“”)方法不仅是获取类类型Class,还表示动态加载。而编译时为静态加载,运行时为动态加载,下面再注解使用中还会提到,这里不做过多说明了。

获取方法信息

首先我们可以通过class获取类的名称,名称可以包含包名可以不包含。

public static void main(String[] arg0) {

        System.out.println(User.class.getSimpleName());
        System.out.println(User.class.getName());

    }

// .................输出结果................

User
idea.analyzesystem.reflection.User

获取一个类的所有public方法以及他的父类的所有public方法可以通过getMethods获取

Class cls = User.class;
Method[] methods = cls.getMethods();

如果我们想要获取自己类内部定义的其他private、 protected方法怎么办呢?可以采取以下方法(该方法不管访问权限,只要是方法都会被获取)

Method[] allSelfMethods = cls.getDeclaredMethods();

获取方法的名字通过getName得到

for(Method method: methods){
            System.out.println(method.getName());
        }
//.....下面输出User的结果................

setLevel
setAge
getNickName
getLevel
getUserName
getAge
getPassword
getEmail
setGender
getIdCard
setIdCard

有时候我们需要反射得到返回值判断具体类型,可以通过method.getReturnType()方法得到。方法有无参函数和有参数的函数,我们可以通过method.getParameterTypes()方法获取方法的所有参数对应的类类型集合。

获取成员变量构造函数信息

通过反射获取定义的成员变量的相关信息可以通过getFields获取所有public定义的成员变量,getDeclaredFields呢则是获取所有定义的成员变量(field.getType获取成员变量类型),下面是相关代码块实例和输出结果对比

public static void main(String[] arg0) {

        Class cls = User.class;
         Field[] fieldspublic = cls.getFields();        
            for(Field field : fieldspublic){
                System.out.println(field.getName());
            }

        System.out.println("********************");

        Field[] fields = cls.getDeclaredFields();       
        for(Field field : fields){
            System.out.println(field.getName());
        }

    }
//............输出结果................

a
test
********************
a
test
uid
userName
password

获取构造函数的名字以及参数列表可以通过cls.getConstructors()获取所有的public修饰的构造函数,cls.getDeclaredConstructors()则可以获取所有关键词修饰的构造函数。

方法反射的基本操作

我们可以通过Class获取到Method,再通过Method调用invoke方法操作对象的方法。下面请看实例代码

public static void main(String[] arg0) {

        User user = new User();
        user.setNickName("hello");

        User user2 = new User();
        user2.setNickName("world");

        Class cls = user.getClass();
        try {
            Method method = cls.getDeclaredMethod("setNickName", String.class);
            method.invoke(user, "idea");
            System.out.println(user.getNickName());
            System.out.println(user2.getNickName());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

通过反射修改User对象的setNickName,下面是测试结果

idea
world

invoke方法的返回值根据方法的返回值判断,void返回null,其他的默认object类型,我们可以根据自己需求强转类型。

通过反射了解集合泛型的本质

反射的操作都是编译后的操作,编译后的泛型是去泛型化的操作。这里通过ArrayList相关操作来论证这一观点。

public static void main(String[] arg0) {

        ArrayList list = new ArrayList<>();
        ArrayList<User> userList= new ArrayList<>();
        userList.add(new User());

        System.out.println(list.getClass()==userList.getClass());

    }
//..........输出结果..........

true

我们在同个反射的方式调用,为userList的方式添加不同于User对象的类型,是可以添加成功的,下面是相关测试代码块

public static void main(String[] arg0) {

        ArrayList list = new ArrayList<>();
        ArrayList<User> userList= new ArrayList<>();
        userList.add(new User());

        System.out.println(list.getClass()==userList.getClass());

        try {
            Method method = userList.getClass().getMethod("add", Object.class);
            method.invoke(userList, "Test ArrayList add other type data");
            System.out.println(userList.toString());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

输出结果

true
[User [uid=null, userName=null, password=null, age=0,
 gender=null, idCard=null, level=0, nickName=null, Email=null], 
 Test ArrayList add other type data]

事实证明我们是可以往List里面添加任何类型的!这里用这么多篇幅来理解反射不是闲的蛋疼的事,在下面的真主注解埋下铺垫,这里不过多透露了,如想知道更多请往下接着看..


注解

概述

如果你不用注解,请不要@me 。说个最简单的例子,Android中通过findViewById得到控件,这是一件繁琐的事情,重复着这些代码好累,使用注解可以把他简单化,注解框架有xtuils、butterknife等,也许你在项目中只希望用到 Inject View这个功能,又或者你想知道这个实现的原理是怎样的。本文主要是解决这两个问题,实现一个最简单的ViewInject.

Java中的常见注解

我们的Activity重写父类的onCreate方法如下(@Override注解表示重写父类方法)


public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

下面在看一幅图

setOnPageChangListener方法在某个版本后过时了( @Deprecated标记某个方法过时)

  @Deprecated
  public void setOnPageChangeListener(OnPageChangeListener listener) {
      mOnPageChangeListener = listener;
  }

过时方法会有警告提示,我们可以在方法/类名上面添加忽略警告的注解,警告提示就不会再存在了(@SuppressWarnings(“Deprecated”)),我们Android开发很多时候如果是因为版本问题忽略警告需要注意版本的兼容性

注解的分类

注解按照运行机制来分类可以分为三大类

  • 源码注解

  • 编译时注解

  • 运行时注解

源码注解表示注解只在源码存在,编译成class就不存在了,编译时注解编译成class还存在,编译时存在。运行时注解表示在运行阶段还会起作用。(元注解是注解的注解,稍后再提一下)

自定义注解

下面通过一个自定义注解来帮助认知自定义注解的要素


@Target(ElementType.FIELD)
@Inherited
@TargetApi(14)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ViewInject{
    int id();

    int[] ids();

    int age() default 18;
}

@interface 表示一个注解定义,注解的方法必须是无参数的,如果有返回值可以默认返回值,如果注解的方法只有一个用value()表示,注解类型支持基本类型、String、Class、Annotation、Enumeration.@Target表示注解的作用域,可以是方法或类、字段上面。@Retention注解的生命周期控制。@Inherited表示允许被继承,@Documented描述注解信息,@TargetApi指定Anddroid开发中的Api可以使用的最低等级。注解使用可以没有成员,我们称之为表示注解。

Xutils注解剖析

通过上面反射相关的了解,我们知道可以通过反射获取类函数变量,并可以执行变量赋值、方法调用。cls.isAnnotationPresent(xx.class)用于判断是否存在指定的注解类型。Method同样支持这个方法,具体用法在我们接下来的xutils viewUtils注解模块来详细了解。下面先看看Xutils使用的注解代码块。(当然实际开发ViewUtils.inject初始化方法都放在基类,实现类Activity都可以不用重写onCreate方法)


@ContentView(R.layout.activity_splash)
public class MainActivity extends Activity{

    @ViewInject(R.id.button_login)
    private TextView textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ViewUtils.inject(this);
    }

    @OnClick(R.id.button_login)
    public void onClick(View v){

    }

    @OnClick({R.id.button_login,R.id.searchView})
    public void onClicks(View v){

    }
}

ViewUtils.inject(this);方法在做解析操作,我们先来看看这些注解定义:ContentView

package com.lidroid.xutils.view.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface ContentView {
    int value();
}

在我们inject方法调用后解析类名上面的注解是这样的

  @SuppressWarnings("ConstantConditions")
    private static void injectObject(Object handler, ViewFinder finder) {

        Class<?> handlerType = handler.getClass();

        // 判断是否存在ContentView注解,如果存在,理解通过注入的方式setContentView(int)
        ContentView contentView = handlerType.getAnnotation(ContentView.class);
        if (contentView != null) {
            try {
                Method setContentViewMethod = handlerType.getMethod("setContentView", int.class);
                setContentViewMethod.invoke(handler, contentView.value());
            } catch (Throwable e) {
                LogUtils.e(e.getMessage(), e);
            }
        }

下面再来看onClick的注解实现,首先有个定义EventBase注解作用于注解

/**
 * Author: wyouflf
 * Date: 13-9-9
 * Time: 下午12:43
 */
@Target(ElementType.ANNOTATION_TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface EventBase {
    Class<?> listenerType();

    String listenerSetter();

    String methodName();
}

OnClick注解定义如下(指定了设置OnClickListener的方法名字以及回调方法名称,支持注解多个控件,这里的value表示view的id值)

/**
 * Author: wyouflf
 * Date: 13-8-16
 * Time: 下午2:27
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@EventBase(
        listenerType = View.OnClickListener.class,
        listenerSetter = "setOnClickListener",
        methodName = "onClick")
public @interface OnClick {
    int[] value();

    int[] parentId() default 0;
}

解析这些方法注解在ViewUtils源码块如下

 // inject event
        Method[] methods = handlerType.getDeclaredMethods();//获取所有方法
        if (methods != null && methods.length > 0) {//方法不为空
            for (Method method : methods) {
                Annotation[] annotations = method.getDeclaredAnnotations();//获取所有的方法上面的注解
                if (annotations != null && annotations.length > 0) {
                    for (Annotation annotation : annotations) {
                        Class<?> annType = annotation.annotationType();
                        if (annType.getAnnotation(EventBase.class) != null) {//如果存在EventBase注解
                            method.setAccessible(true);
                            try {
                                // ProGuard:-keep class * extent java.lang.annotation.Annotation { *; }
                                //如果使用了注解要添加混淆规则,保证注解不能被混淆
                                //下面开始为EventListenerManager添加监听事件,EventBase注解了添加事件的方法名称以及回调方法名称
                                Method valueMethod = annType.getDeclaredMethod("value");
                                Method parentIdMethod = null;
                                try {
                                    parentIdMethod = annType.getDeclaredMethod("parentId");
                                } catch (Throwable e) {
                                }
                                Object values = valueMethod.invoke(annotation);
                                Object parentIds = parentIdMethod == null ? null : parentIdMethod.invoke(annotation);
                                int parentIdsLen = parentIds == null ? 0 : Array.getLength(parentIds);
                                int len = Array.getLength(values);
                                for (int i = 0; i < len; i++) {
                                    ViewInjectInfo info = new ViewInjectInfo();
                                    info.value = Array.get(values, i);
                                    info.parentId = parentIdsLen > i ? (Integer) Array.get(parentIds, i) : 0;
                                    EventListenerManager.addEventMethod(finder, info, annotation, handler, method);
                                }
                            } catch (Throwable e) {
                                LogUtils.e(e.getMessage(), e);
                            }
                        }
                    }
                }
            }
        }
    }

inject方法的调用变量赋值这块,关于ViewInject注解定义如下(不得不说注解value只支持单个控件,个人觉得支持批量注解控件多好的,可以减少很多代码,如果你有兴趣可以尝试修改它):

package com.lidroid.xutils.view.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.FIELD)//作用在字段上面
//运行时任然有效,如果改为class 或者编译时就会有问题了,findById找不到
//变量为空引用时抛出空指针异常,如果混淆了注解,也会导致找不到控件
@Retention(RetentionPolicy.RUNTIME)
public @interface ViewInject {

    int value();

    /* parent view id */
    int parentId() default 0;
}

注解变量的解析在ViewUtils的实现如下:


    private static void injectObject(Object handler, ViewFinder finder) {

      //...................略...................

        Field[] fields = handlerType.getDeclaredFields();//查找出所有控件变量
        if (fields != null && fields.length > 0) {
            for (Field field : fields) {
                //控件变量注解找到后通过finder提供的findById获取控件实例
                ViewInject viewInject = field.getAnnotation(ViewInject.class);
                if (viewInject != null) {
                    try {
                        View view = finder.findViewById(viewInject.value(), viewInject.parentId());
                        //打开权限然后用反射赋值
                        if (view != null) {
                            field.setAccessible(true);
                            field.set(handler, view);
                        }
                    } catch (Throwable e) {
                     //如果用ViewInject注解了但是找不到视图的话直接抛出了运行时异常
                        LogUtils.e(e.getMessage(), e);
                    }
                } else {
                   //..............略过其他注解解析................
                }
            }
        }
}

小结

通过反射和注解的系统的学习了解,我们可以把我们的代码玩的更好了,再也不用愁看不懂别人写的注解代码了,根据慕课视频还get到一点,我们应用开发的数据缓存是家常便饭,我们可以通过注解的方式创建数据库表,注解的方式实现增删改sqlite的表数据,虽然我们当前使用的多数为第三方的sqlite相关的开源库,我们遇到注解如此的实现还是可以去了解一下的,xutils的db模块可以参考,尽管xutils目前已经不再维护有了xutils3.0,我们不能否定xutils是一个非常不错的开源项目。

参考资料

视频资料:http://www.imooc.com/video/3738,http://www.imooc.com/learn/456
Xutils源码层注解解析推荐:http://blog.youkuaiyun.com/drkcore/article/details/50922448

深入解析Kotlin注解与反射基础:Android开发的必备技能 本文深入解析了Kotlin中注解与反射两大核心技术在Android开发中的应用。主要内容包括:1)注解的基础定义、内置注解使用和自定义参数化注解;2)反射的核心概念、动态方法调用及与注解结合的框架设计;3)构建注解驱动服务架构的实践案例;4)性能优化与平台兼容性问题解决方案;5)面试常见问题解析。文章强调合理运用这些技术可提升代码表达力、简化架构设计,但需注意性能开销和安全风险,为开发者提供了从基础到进阶的系统性指导。 阅读详情

相关推荐

Android开发秘籍:深度掌握Kotlin注解与反射实战精髓

本文深入解析Kotlin注解与反射两大元编程核心技术,构建包含16个模块的完整知识体系。主要内容包括:1)注解系统的声明规范、保留策略及工业级应用案例;2)Kotlin反射特性与Java反射的关键差异及实战操作;3)注解与反射协同实现依赖注入、权限代理等典型场景;4)跨平台序列化、热修复等工业解决方案;5)性能优化策略与安全实践。通过多个代码示例和面试题解析,帮助开发者掌握从基础到高阶的应用能力,提升Android开发中的元编程水平。

郑伟强dev的专栏 150

反射还能这么玩?

其实本来想加个前缀,结果标题是《Android 中反射还能这么用?》,后来想想,也不恰当,就把Android去了,本身反射是Java的东西,你硬生生的加个Android显然是不恰当的。 这几天稍微过了一下Weex的源码,可谓是亲眼目睹了它的源码。无意间发现一个类,叫WXHack,搜索一下代码,发现在Weex里用的地方就一处,好奇心驱使下去看了WXHack的源码,好家伙!看完之后总觉得这个类似曾相识

区长的专栏 1万+

Android开发者必看:火山引擎API验签实战,5分钟搞定年龄变化接口调用

本文为Android开发者提供火山引擎API验签实战指南,重点解析HMAC-SHA256签名算法实现,并以年龄变化接口为例展示完整调用流程。通过OkHttp封装和性能优化建议,帮助开发者5分钟内快速集成火山引擎人像处理功能,解决API调用中的签名验证、参数编码等核心问题。

weixin_30342209的博客 317

【Java高级】利用反射获取非静态内部类有参(无参)构造方法 创建内部类对象 调用内部类方法 内部类全限定类名规律 getConstructor getMethod getField getClass

利用反射获取非静态内部类有参(无参)构造方法 创建内部类对象 调用内部类方法 内部类全限定类名规律getConstructor()获取非静态内部类构造方法时需要传入参数【外部类.class】。 newInstance创建非静态内部类对象时需要传入外部类对象。需要在所需要的参数前加上外部类对象getMethod()获取public修饰方法。 getMethods()能获取所有的public修饰方法(包括继承的方法)。 getDeclaredMethod()getDeclaredMethods()

cc2855816075的博客 2220

高通SA8155P车载Camera开发避坑指南:从硬件拓扑到AIS服务调试全流程

本文详细解析了高通SA8155P车载Camera开发全流程,从硬件拓扑设计到AIS(Automotive Imaging System)服务调试,涵盖关键组件配置、软件架构剖析及高级调试技巧。通过实战经验分享,帮助开发者避开常见陷阱,优化系统性能,适用于智能驾驶系统的环境感知开发。

weixin_42550597的博客 331

「极简」扣子(coze)教程 | 细节决定成败!这个小功能让用户满意度飙升,讲的太细了

这一期大师兄通过向扣子(coze)应用添加提示语的方法向用户显示系统运行的状态。

u014527622的博客 2111

Android反射+动态代理 捕捉所有点击事件(View.OnCLickListener,AbsListView.OnItemClickListener)

代理处理类: ProxyClickHandler import android.annotation.SuppressLint; import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.widget.AbsListView; import android.widget.AdapterView; import com.android.javaporject.R;

DengDongQi的博客 1593

用deepseek部署全自动的机器人--bytebot

Bytebot是一款开源AI桌面代理,提供完整的虚拟桌面环境,支持跨应用任务处理、文件管理、文档处理等复杂工作流。其技术架构包含核心控制、LLM代理、UI等组件,支持Docker和Kubernetes部署。本文演示了基于CloudStudio的部署流程,包括环境配置、Docker部署及DeepSeek API集成,实现多模型调用功能。

Kin 2481

(个人总结向)Android中的反射使用

个人总结笔记,不具备指导作用,怕说错了说漏了带坏其他同学,有错误的地方希望热心的同学可以指出,感谢 进入正片 我们在使用反射的时候,最主要的目的自认为是可以去操作一些原本设计不想要被外部操作的一些方法、属性,从而达到某种效果。 所以在这里主要记录一下想要通过反射操作原本不能被操作的方式属性的流程。 一、Class的获取 首先是获取Class对象,分为三种方式: 1、通过Object.g...

weixin_42312194的博客 743

实战|2026美团&大众点评餐饮数据抓取:Playwright/Selenium反爬全攻略

核心结论:2026年美团&大众点评的反爬核心是“多维度风控”,需组合使用“住宅IP+设备指纹伪装+真人行为模拟+动态验证处理”,Playwright是最优工具,Selenium仅作为补充。效率优化:单机爬取速度建议控制在“每小时500-800条”,避免高频请求触发风控;分布式爬取需确保每个节点使用独立住宅IP,且行为轨迹不一致。扩展方向集成WASM解密工具,破解2026年美团的Token加密;用AI识别动态点选验证,提升验证通过率;对接大数据平台,对抓取的餐饮数据进行可视化分析。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 2461

LVGL在单色屏上运行

本文主要讲述LVGL在单色屏应用中的实现思路,并已验证通过。网上关于lvgl移植的文章有很多了,本文不加以赘述。

weixin_43278295的博客 4462

Android 反射调用类

一、反射调用static方法携带参数: ClassLoader loader = MainActivity.class.getClassLoader(); Class clz; clz = loader.loadClass("com.example.jbptest.TestFunction"); Method m = clz.getDeclaredMethod("add",int.cl

waiting alone的博客 7734

R语言 Chow Test

Chow 测试用于测试不同数据集上的两个不同回归模型中的系数是否相等。 该测试通常用于计量经济学领域,使用时间序列数据来确定数据在某个时间点是否存在结构性中断。 本教程提供了如何在 R 中执行 Chow 测试的分步示例 首先,我们将创建一些假数据: #create data data <- data.frame(x = c(1, 1, 2, 3, 4, 4, 5, 5, 6, 7, 7, 8, 8, 9, 10, 10, 11, 12, 12, 13,

Mrrunsen的博客 1946

安卓开发之,教你使用反射+注解

安卓开发之教你使用反射+ 注解 手把手教你定义自己的注解,以及注解解析、

生活不止眼前的苟且 385

YOLOv11【第三章:高阶应用与落地篇·第7节】多任务联合训练(Multi-Task Learning):检测+分割+关键点三头并进!

🏆 本文收录于专栏 《YOLOv11实战:从入门到深度优化》。本专栏围绕 YOLOv11 的改进、训练、部署与工程优化 展开,系统梳理并复现当前主流的 YOLOv11 实战案例与优化方案,内容目前已覆盖 分类、检测、分割、追踪、关键点、OBB 检测 等多个方向。

**My Coding Family** 727

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Java 筑基之注解&反射,安卓开发中遇到最难的问题

反射就是在运行状态中,获取一个类的所有属性和方法,能够调用它的对象的属性和方法,并且能够改变其属性,主要功能如下:在运行时构造任意一个类的对象在运行时获取或者修改任意一个类所具有的成员属性和方法获取Class对象的三种方式通过类名获取 —>类名.class通过对象获取 ---->对象名.getClass()通过全类名获取 ------>Class.forName(String className) classLoader.loadClass(String className)判断是否为某个类的实例isIns

m0_61549674的博客 966

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Android开发之注解与反射的应用

@Retention 三个值中 SOURCE < CLASS < RUNTIME,即CLASS包含了SOURCE,RUNTIME包含SOURCE、 CLASS。

qq_36828822的博客 228

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

反射和注解在android开发中的应用

一,反射:说白了反射主要解决那些我们平时解决不了的问题。比如一个类的构造,属性,普通方法为私有的情况下,或者某些方法虽然不是私有的方法但是是被隐藏的方法,我们就需要使用反射才能获得他们。一般使用Class类来完成反射,这个类把成员变量划分为Filed区域,把构造划分在Construct,把普通方法划分在method区域。下面就来看反射的应用。 1,通过反射获得构造方法 1.1 通过反射获得构造...

yaoyaoyao_123的博客 282

【安卓笔记】注解反射,优雅的findViewById

结合注解,实现一劳永逸

liosen的博客 407

Android注解、反射及其应用--轻量级ButterKnife实现

1. 背景 Android开发,少不了遇到注解,比如写一个Activity,基本都要用注解@Override。反射呢,一般用不到,但是如果想自己实现注解,就得用了。所以一般注解和反射,都放在一起讨论。 2. 注解 Annotation(注解)就是Java提供了一种源程序中的元素关联任何信息或者任何元数据(metadata)的途径和方法。 Annotation是被动的元数据,永远不会有主动行为 自定...

newchenxf的专栏 402

Kotlin基础(十一):反射和注解

本文主要讲解kotlin反射和注解

分享计算机基础,android,C/C++,音视频等内容 2790

Android中注解的使用

安卓开发中会有很多地方使用到注解,有些是Java中的,有些是三方框架所带的。 Java中的常见的几种标准注解 @Override 表示当前的方法定义将覆盖父类中的方法。 @Deprecated 表示废弃的意思,使用了该注解的方法或者对象,则会有提示。 @SuppressWarnings 关闭不当的编译器警告信息 上述几种标准注解我们在安卓开发的过程中经常会看到,不过我们平常使用的注解还有...

莫失莫忘的博客 625

Android Method Validator 基于AspectJ,注解,反射开发的Android方法、参数校验库,支持自定义规则校验

android-validator 基于AspectJ,注解,反射开发的Android方法、参数校验库,支持自定义规则校验 可以方便的在方法调用时进行参数,变量的合法性校验。 Github 地址 android-validator 目前支持的方法 在某些方法调用时检查参数的合法性并进行提示或其他操作 目前提供的注解有(支持自定义): 注解 说明 支持类型 NotBlank 不可...

aos3618的博客 474

@column注解_Java 注解及其在 Android 中的应用

Linux编程点击右侧关注,免费入门到精通!作者丨WngShhnghttps://juejin.im/post/5b824b8751882542f105447d一般的,注解在 Android 中有两种应用方式,一种方式是基于反射的,即在程序的运行期间获取类信息进行反射调用;另一种是使用注解处理,在编译期间生成许多代码,然后在运行期间通过调用这些代码来实现目标功能。在本篇文章中,我们会先重...

weixin_39719472的博客 560
上一篇: Android-ObservableScrollView(二)
下一篇: Android开发之蓝牙通信(一)
AnalyzeSystem
博客等级 码龄11年 204粉丝 114原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值