A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 闾丘日月 中级黑马   /  2012-6-30 22:12  /  1870 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

这两天重新看张老师的高新视频,有些是越看越清楚,有些确越来越迷糊。
我想问的问题是注解的,注解我是这么理解的,和c++里面的条件编译有些类似,比如说我应该可以自己写个@if的注解来让控制编译器是否编译这一段源代码到class文件中,不知道这么理解是不是可以。当然有些不同的是在特别的runtime的注解不止可以控制编译器了,还可以来控制jvm,在某些特定的情况下运行某些代码。
这个理解如果是有点道理,那么@if的注解应该怎么写?
如果错误很大,那么我如果在java语言中用到了native代码,就不能够跨平台了么?c++里面的跨平台的特性基本上都是通过条件编译来实现的,java里无法做到这一点么?

评分

参与人数 1技术分 +2 收起 理由
刘蕴学 + 2 想法不错

查看全部评分

2 个回复

倒序浏览
其实我理解注解时和楼主思考的很相似,不过这个@if的作用也太厉害了,我想@if与@Override  的源代码查不多。
import java.lang.reflect.Method;

public class Test_1 {
        /*
         * 被注解的三个方法
         */
        @Test(id = 1, description = "hello method_1")
        public void method_1() {
        }

        @Test(id = 2)
        public void method_2() {
        }

        @Test(id = 3, description = "last method")
        public void method_3() {
        }

        /*
         * 解析注解,将Test_1类 所有被注解方法 的信息打印出来
         */
        public static void main(String[] args) {
                Method[] methods = Test_1.class.getDeclaredMethods();
                for (Method method : methods) {
                        /*
                         * 判断方法中是否有指定注解类型的注解
                         */
                        boolean hasAnnotation = method.isAnnotationPresent(Test.class);
                        if (hasAnnotation) {
                                /*
                                 * 根据注解类型返回方法的指定类型注解
                                 */
                                Test annotation = method.getAnnotation(Test.class);
                                System.out.println("Test( method = " + method.getName()
                                                + " , id = " + annotation.id() + " , description = "
                                                + annotation.description() + " )");
                        }
                }
        }

}
这是我从网上搜的,希望对楼主有用。其他的问题我就不会了。

点评

你敢屠版不  发表于 2012-6-30 23:44
回复 使用道具 举报
又有了新的一些理解了,下面是我设计的注解@If
@Retention(value=RetentionPolicy.RUNTIME)
@Target(value=ElementType.METHOD)
public @interface If {
        boolean value();
}
和使用了注解类的类
public class UseIf {
        @If(true)
        public static void funTrue(){
                System.out.println("i am fun true");
        }       
        @If(false)
        public static void funFalse(){
                System.out.println("i am fun false");
        }
}
还有通过反射来调用使用了注解类的类,为了简化,假设我知道可调用的注解类的名字
public class ReflectTest {
        public static void main(String[] args) throws Exception {
                Class clazz = Class.forName("cn.itcast.UseIf");
                Object obj = clazz.newInstance();
                Method[] methods = clazz.getMethods();
                if(methods!=null){
                        for(Method method:methods){
                                if(method.isAnnotationPresent(If.class)&&method.getAnnotation(If.class).value()){
                                        Class[] params = method.getParameterTypes();
                                        method.invoke(obj, params);
                                }
                        }
                }
        }
}
运行结果是i am fun true
这个实验能够成功的解决上了if(true)的注解的方法被调用,但是没有解决条件编译的问题。。我不知道sun公司自己用的api有没有提供代码块的反射,反正就我目前学习的反射包里面是没有这个对象的,我们如果要达到条件编译或者说条件运行,只能将需要被分条件的代码块封装到方法内或者对象内再来做。
看黎活明老师的spring视频,这注解人家在spring框架里面的用法和配置文件的作用差不多,无非就是为了简化配置文件的书写。别的用法还不知道。
不知道能否通过javax.tools这套api来实现对编译器的控制。我曾经试过将加了注解@Override的源代码和没加这个注解的源代码分别用编译器编译,得到的两个文件大小一模一样,但是不知道它们的class文件是否一样。
这个论坛是不是很少有老师来逛的哇,给点建议和提示撒。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马