java复习笔记7

 

  java的反射机制

    平时的编程中并不会用到反射, 但是在编写框架的时候,反射用的就多了,比如你要使用某一个类进行操作,但是这个类是用户通过配置文件配置进来的,你需要先读配置文件,然后拿到这个类的全类名:比如com.xx.Person,然后在利用反射API来做操作, 反射能让程序更加灵活;

  可以利用三种方式,获取Class的实例, 第一种方式: Class.forName是用的是最多的

运行下面代码

复制代码
package org.nono.getClassName;
class X{
    public String name = "nono";
}
public class getClassDemo {
    public static void main(String args[]) {
        Class<?> c = null;
        Class<?> c1 = null;
        Class<?> c2 = null;
        X x = new X();
        try{
            c = Class.forName("org.nono.getClassName.X");
        }catch(Exception e) {
            e.printStackTrace();
        }
        c1 = X.class;
        c2 = x.getClass();
        System.out.println(c);
        System.out.println(c1);
        System.out.println(c2);
    }
}
复制代码

 

  利用反射实现的实例化对象, 使用反射实例化对象时候, 最好必须存在一个无参的构造方法, 否则使用class.newInstance();会报错;

运行下面代码

复制代码
class Demo {
    public String name = "";
    public void setName (String name) {
        this.name = name;
    }
}
public class InstanceDemo {
    public static void main(String args[]) {
        Class<?> c = null;
        try{
            c = Class.forName("Demo");
            Demo demo = (Demo)c.newInstance();
            demo.setName("hehe");
            System.out.println(demo.name);
        }catch(Exception e) {
            e.printStackTrace();
        }
    }
}
复制代码

 

  如果在实际开发中必须使用有参构造的方式实例化对象, 必须引用java.lang.reflect.Constructor类:

运行下面代码

复制代码
import java.lang.reflect.*;
class Demo {
    public String name = "";
    public Demo(String name) {
        this.name = name;
    }
    public void setName (String name) {
        this.name = name;
    }
}
public class InstanceDemo {
    public static void main(String args[]) {
        Class<?> c = null;
        try{
            c = Class.forName("Demo");
            Constructor ct[] = null;
            ct = c.getConstructors(); 
            Demo demo = (Demo)ct[0].newInstance("hehe");
            System.out.println(demo.name);
        }catch(Exception e) {
            e.printStackTrace();
        }
    }
}
复制代码

 

  java的反射让java更加灵活了,利用反射, 只要知道构造函数的名字,就能直接实例化方法, 能够优化代码:

运行下面代码

复制代码
interface Fruit{
    public String name="";
}
abstract class FruitName  implements Fruit{
    public String name="";
    public String getName() {
        return this.name;
    }
}
class Apple extends FruitName {
    public String name = "apple";
}
class Pear extends FruitName {
    public String name = "pear";
}
public class FactoryDemo{
    public static void main(String args[]) {
        Class<?> c = null;
        Class<?> c1 = null;
        try{
            c = Class.forName("Apple");
            c1 = Class.forName("Pear");
            System.out.println(c.newInstance());
            System.out.println(c1.newInstance());
        }catch(Exception e) {
            e.printStackTrace();
        }
    }
}
复制代码

 

  常用的3个annotation

  java的annotation

运行下面代码

复制代码
import java.util.*;
class Demo{
    public void print() {
        System.out.println("DemoGet");
    }
}
class SuperDemo<T> extends Demo{
    private T t = null;
    @Override
    public void print() {
        System.out.println("SuperDemoGet");
    }
    @Deprecated
    public void show() {
        System.out.println("Supershow");
    }
    public T get() {
        return t;
    }
    public void set(T t) {
        this.t = t;
    }
}
public class AnnotationDemo {
    @SuppressWarnings({"unchecked"/*,"override"*/,"deprecation"})
    public static void main(String args[]) {
        SuperDemo sd = new SuperDemo();
        sd.show();
        HashMap hm = new HashMap();
    }
} 
复制代码

  @Override的RetentionPolicy作用范围是SOURCE, 只能在源程序中出现;

  @Deprecated的作用范围是在RUNTIME中, 在执行的时候也出现;

  @SuppressWarning的作用范围是SOURCE;

  

  自定义Annotation

  先写一个主方法:

运行下面代码

复制代码
@myAnno(name="hehe")
@myAnno1(arr={"1","2"})
public class AnnoDemo {
    public static void main(String args[]) {

    }
}
复制代码

 

  自定义的Annotation   @myAnno

运行下面代码

import java.lang.annotation.*;
@Retention(value=RetentionPolicy.RUNTIME)
public @interface myAnno {
    public String name();
}

 

  自定义的Annotation   @myAnno1

运行下面代码

import java.lang.annotation.*;
@Retention(value=RetentionPolicy.RUNTIME)
public @interface myAnno1 {
    public String[] arr();
}

本文作者:方方和圆圆

本文链接:https://www.cnblogs.com/diligenceday/p/5237845.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   方方和圆圆  阅读(196)  评论(0编辑  收藏  举报
历史上的今天:
2014-03-04 2014为止移动端的手机屏幕尺寸缩略图
2014-03-04 bugzilla_firefox

再过一百年, 我会在哪里?

💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起
点击右上角即可分享
微信分享提示