反射:
主要是指程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义。
反射是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
网友评论