java 反射机制

2017-10-01  本文已影响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
上一篇 下一篇

猜你喜欢

热点阅读