美文网首页
java 反射机制

java 反射机制

作者: 谁吃了我的薯条 | 来源:发表于2017-10-01 10:26 被阅读0次

    反射:
    主要是指程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义。
    反射是java中一种强大的工具,能够使我们很方便的创建灵活的代码,这些代码可以再运行时装配,无需在组件之间进行源代码链接。但是反射使用不当会成本很高!

    java.lang.class类,是所有反射操作的源头,它含有三种实例化方法;
    1、getClass()

    @HotSpotIntrinsicCandidate
        public final native Class<?> getClass();
    

    调用getClass()*可以得到类的出处;

    package StringBase;
    
    import java.util.Date;
    import java.util.concurrent.ExecutionException;
    import java.util.concurrent.FutureTask;
    
    public class Test {
        public static void main(String[] args) throws Exception{
            Date data=new Date();
            Class<?> cls=data.getClass();
            System.out.println(cls);
    
        }
    }
    ------
    class java.util.Date
    

    2、使用“类.Class"的语法
    此方法无需实例化对象;

    package StringBase;
    
    import java.util.Date;
    import java.util.concurrent.ExecutionException;
    import java.util.concurrent.FutureTask;
    
    public class Test {
        public static void main(String[] args) throws Exception{ ;
            Class<?> cls=Date.class;
            System.out.println(cls);
    
        }
    }
    -----
    class java.util.Date
    

    3、调用Class类的一个方法
    此时可以不掉用import引用,而且类名称参数为字符串;

      @CallerSensitive
        public static Class<?> forName(String className)
                    throws ClassNotFoundException {
            Class<?> caller = Reflection.getCallerClass();
            return forName0(className, true, ClassLoader.getClassLoader(caller), caller);
        }
    
    package StringBase;
    
    public class Test {
        public static void main(String[] args) throws Exception{ ;
            Class<?> cls=Class.forName("java.util.Date");
            System.out.println(cls);
    
        }
    }
    -----
    class java.util.Date
    

    反射实例化对象
    对象实例化的代码,可以不使用关键字new,可以利用反射来完成(newInstance())
    一切的耦合都起源于new;
    使用反射调用构造
    采用newInstance只能调用无参构造方法,若无无参构造方法,则采用
    Constructor 和 getConstructor,因为使用起来较为麻烦,故必须保留无参构造方法(可以采用重载);

    
    package just;
    
    public class StringBase {
        private String title;
        private String price;
        public StringBase(String title,String price){
            this.title=title;
            this.price=price;
        }
        public String toString(){
            return this.title+" "+this.price;
        }
    }
    
    package StringBase;
    import just.StringBase;
    import java.lang.reflect.Constructor;
    public class Base{
        public static void main(String args[])throws Exception{
            Class<?> cls=Class.forName("just.StringBase");
            Constructor<?> base=cls.getConstructor(String.class,String.class);
            Object obj=base.newInstance("hsjfans","99999");
            StringBase c=(StringBase)obj;
            System.out.println(c);
        }
    }
    

    反射调用方法
    实例化方法有三种,new\ clone \反射(newInstance)
    反射调用方法,可以不给出具体类名与方法名(前提是:方法命名标准),进行方法的操作;

    package just;
    
    public class StringBase {
        private String title;
        private String price;
    
        public StringBase(){
        }
        public void setTitle(String title) {
            this.title = title;
        }
    
        public void setPrice(String price) {
            this.price = price;
        }
    
        public String getTitle() {
            return this.title;
        }
    
        public String getPrice() {
            return this.price;
        }
    
        public String toString(){
            return this.title+" "+this.price;
        }
        public void set(String title,String price){
            this.title=title;
            this.price=price;
        }
    }
    
    package StringBase;
    import java.lang.reflect.Method;
    
    
    public class Base{
        public static String fileName(String filename){
            return filename.substring(0,1).toUpperCase()+filename.substring(1);
        }
    
        public static void main(String args[])throws Exception{
            String filename="title",filetitle="price";
            Class<?> cls=Class.forName("just.StringBase");
            Object obj=cls.newInstance();//实例化对象;
            Method setMethod=cls.getMethod("set",String.class,String.class);
            Method getMethod=cls.getMethod("get"+fileName(filename));
            setMethod.invoke(obj,"hsjfans","88888");
            System.out.println(getMethod.invoke(obj));
    
        }
    }
    ------
    hsjfans
    

    相关文章

      网友评论

          本文标题:java 反射机制

          本文链接:https://www.haomeiwen.com/subject/amjwextx.html