黑马程序员技术交流社区
标题:
注解的小问题
[打印本页]
作者:
闾丘日月
时间:
2012-6-30 22:12
标题:
注解的小问题
这两天重新看张老师的高新视频,有些是越看越清楚,有些确越来越迷糊。
我想问的问题是注解的,注解我是这么理解的,和c++里面的条件编译有些类似,比如说我应该可以自己写个@if的注解来让控制编译器是否编译这一段源代码到class文件中,不知道这么理解是不是可以。当然有些不同的是在特别的runtime的注解不止可以控制编译器了,还可以来控制jvm,在某些特定的情况下运行某些代码。
这个理解如果是有点道理,那么@if的注解应该怎么写?
如果错误很大,那么我如果在java语言中用到了native代码,就不能够跨平台了么?c++里面的跨平台的特性基本上都是通过条件编译来实现的,java里无法做到这一点么?
作者:
赵志勇
时间:
2012-6-30 22:33
其实我理解注解时和楼主思考的很相似,不过这个@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-7-1 23:22
又有了新的一些理解了,下面是我设计的注解@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文件是否一样。
这个论坛是不是很少有老师来逛的哇,给点建议和提示撒。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2