基础反射概念之调用构造和普通方法和成员

来源:互联网 发布:苹果手机备份数据 编辑:程序博客网 时间:2024/05/16 07:36

package learn.reflect/假设这个包存的是主类(Reflex),Book类不在此包中,在learn.reflect.way3包中主类,不会出现导入Book类的语句/。
import java.lang.reflect.Constructor;//此类接收一个构造
import java.lang.reflect.Method;//此类接收一个普通方法
/*反射:一般来讲,都是先有类再new一个对象实现实例化,但也可使用反射即用 Class 的 对象来接收你指定的类,Class的对象再调用newInstance()找到这个指定类中的无参构造来实例这个类,产生一个Object对象,那如果是有参构造呢?,在程序中我会说明。
反射调用普通方法我也会说明。
实现方式:
X{
}//X表示某一个类
1.Class《?》cla1=X.getClass();//调用类中的geClass方法获得一个指定类
Object obj1=cla.newInstance();//反射完成,获得一个指定类的实例
2.Class 《?》cla2=X.class;//调用类中的一个class成员获得一个指定类
Object obj2=cla2.newInstance();//反射完成,获得一个指定类的实例
3.Class《?》cla3=Class.forName(“java.learn.reflex.way3”);/调用Class中的静态方法 forName(“String className”),输入一个完整的包.类。这个类就是一个指定类/
Object obj3=Cla3.newInstance();//反射完成,获得一个指定类的实例
*/

public class Reflex{
//如果类中没有无参构造,则要使用Class类中的getConstructor()方法
public static void main(){
/保存指定类的信息,还是声明一个对象,我也不知道,如果有大神看到,告诉我这个萌新吧/
Class 《?》 cla=Class.forName(“learn.reflect.way3.commodity”);
/根据传getconstructor方法中类型和个数来重载构造,返回指定类的不同构造/
Constructor 《?》 con=cla.getConstructor(String.class);
/传入一个String,并且实例完成/
Object obj=con.newInstance(“安全裤”);
//输出验证
System.out.println(obj);
//反射调用普通方法必须要使用Method类的对象来接收。
String fieldName=”price”;//这里的p小写
//(方法名字,此方法的参数)无返回值不用写
Method setMet=cla.getMethod(“set”+initcat(fieldName),double.class);
Method getMet=cla.getMethod(“get”+inincat(fieldName));
setMet.invoke(obj,58.8);//调用底导方法,就是此对象中保存的方法
Sysetm.println.out(getMet.invoke());//输出返回值验证
}
public static String initcap(String reviseFieldName){//让方法名称首字母大写
return reviseFieldName.subString(0,1).toUpperCase()+reviseFieldName.subString(1);
/首先截取0—1长度(不包括1)的字符串使首字母大写。再加上截取1长度以后(包括1)的所有字符串使首字母以外的字符串再加进来。/
//用getDeclaredField()来获得成员title并修改
Field fie=cla.getDeclaredField(“title”);
fie.set(obj,”java开发”);
fie.setAccessible(true);//解除封装
System.out.println(fie.get(obj));//输出fie中的属性
}
}

//Book类不在此包中
class commodity{
private String tilte;
private double price=88.8;
public commodity(String title){
this.title=title;
}
public commodity(String title,double price){
this.title=title;
this.price=price;
}
public void setPrice(double price){
this.price=price;
}
public double getPrice(){
return this.price;
}
public String toString(){
return “商品名:”+this.title+”\n”+”售价:”+this.price;
}
}
备注:《》=<>不这样做显示不出来内容

0 0