欢迎光临散文网 会员登陆 & 注册

Java反射:赋值,设置,通过反射调用getter和setter方法,Tools类【诗书画唱】

2020-09-01 08:34 作者:诗书画唱  | 我要投稿

Class.forName()加载类

getDeclaredMethod


自己总结的语法或重要提醒内容等:

// 自己总结的语法(多记录自己总结的语法,之后用等):

// 当setXXX等的方法有一个参数时

//

// setDeclaredMethod("setXXX",包装类类型名.class)






1、创建Product商品类,包含商品名称name和商品价格price两个属性以及getter和setter,通过反射调用Product的getter和setter方法,设置商品名称是卫龙辣条,价格是6.5并打印出来。





//每个类没写东西时,有一个默认的构造方法

//(当写了自己建的构造方法时,默认构造方法就没有)

package ClassfanShe;

//下面的class前不可加public等

class Product {

String name;

// 下面的price等前面不可以用double,最好都用包装类Double等:

Double price;



public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public Double getPrice() {

return price;

}

public void setPrice(Double price) {

this.price = price;

}



}



package ClassfanShe;

import java.io.IOException;

import java.io.InputStream;

import java.lang.reflect.InvocationTargetException;

import java.lang.reflect.Method;

import java.util.Properties;


public class PsetGet {


public static void main(String[] args) {

// TODO Auto-generated method stub


try {

Class c = Class.forName("ClassfanShe.Product");


Object nameSet = c.newInstance();

//  用getDeclaredMethod获取到setXXX方法:

Method Method1 = c.getDeclaredMethod("setName",String.class);

// 用invoke调用getXXX方法:


Method1.invoke(nameSet, "卫龙辣条");

 


// 用getDeclaredMethod获取getXXX方法

Method Method2 = c.getDeclaredMethod("getName");

Object nameGet = Method2.invoke(nameSet);

 

 

System.out.println((String)nameGet);

//——————————

// 自己总结的语法(多记录自己总结的语法,之后用等):

// 当setXXX等的方法有一个参数时

//

// setDeclaredMethod("setXXX",包装类类型名.class)

 

Method Method11 = c.getDeclaredMethod("setPrice", Double.class);

Object priceSet = c.newInstance();

Method11.invoke(priceSet, 6.5);


Method Method22 = c.getDeclaredMethod("getPrice");

Object priceGet = Method22.invoke(priceSet);

System.out.println(priceGet);

// ——————————

System.out.println("商品名称是"+nameGet+",价格是"+priceGet+"元");

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}


}



2、定义一个类Person,包含属性name、age。使用反射的方式创建一个实例、使用反射方式给name和age属性赋值为小明和18岁。

package ClassfanShe;


public class Person {

String name;

Integer age;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public Integer getAge() {

return age;

}

public void setAge(Integer age) {

this.age = age;

}

}

package ClassfanShe;

import java.io.IOException;

import java.io.InputStream;

import java.lang.reflect.InvocationTargetException;

import java.lang.reflect.Method;

import java.util.Properties;


public class PersonFS {


public static void main(String[] args) {

// TODO Auto-generated method stub


try {

Class c = Class.forName("ClassfanShe.Person");


Object nameSet = c.newInstance();


Method Method1 = c.getDeclaredMethod("setName",String.class);



Method1.invoke(nameSet, "小明");

 



Method Method2 = c.getDeclaredMethod("getName");

Object nameGet = Method2.invoke(nameSet);

 

// ——————————

 

Method Method11 = c.getDeclaredMethod("setAge", Integer.class);

Object ageSet = c.newInstance();

Method11.invoke(ageSet, 18);


Method Method22 = c.getDeclaredMethod("getAge");

Object ageGet = Method22.invoke(ageSet);


// ——————————

System.out.println("诗书画唱告诉你,此人为"+nameGet

+",年龄为"+ageGet+"岁");

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}


}





3、创建一个Tools类,定义一个带两个Integer类型参数的add方法,返回值是这两个参数的和,通过反射调用这个方法,并打印出结果。

上面的类中再定义一个方法,此方法可以获取obj对象中名为propertyName的属性的值(个人理解:就是属性名,取名不一定为propertyName)。

上面的类中再定义一个方法,此方法可将obj对象中名为propertyName的属性的值(个人理解:就是属性名,取名不一定为propertyName)设置为value.


下面提供参考,不一定要用:

public class Tools {

    public void setProp(Student obj,String propName,Object value){

    //.. 

    }

    

    public static void main(String[] args) {

    Tools t = new Tools();

    Student s = new Student();

    t.setProp(s, "name","李四");

    t.setProp(s, "age",12);

}

}

package ClassfanShe;


public class Student {

String propertyName;

Integer age;

}

package ClassfanShe;


class Tools {

Integer a;

Integer b;

private Student obj;

private String propName;

private Object value;

public int add(Integer a,Integer b) {

return a + b;

}



public  String setProp(Student obj,String propName,Object value){



return propName;

    }


public  Object setProp(Student obj,Object propName,Object value){



return propName=value;

    }


}



package ClassfanShe;

import java.io.IOException;

import java.io.InputStream;

import java.lang.reflect.InvocationTargetException;

import java.lang.reflect.Method;

import java.util.Properties;


public class ToolsFS {


public static void main(String[] args) {

try {


System.out.println("下面是调用获取属性名字的方法:");

Class c = Class.forName("ClassfanShe.Tools");


Object nameSet = c.newInstance();


Method Method1 = c.getDeclaredMethod("setProp",

Student.class,String.class,Object.class);




Tools t = new Tools();


Student s = new Student();


//t.setProp(s, "name","李四");

//

//t.setProp(s, "age",12);


System.out.println("1:"+ 

Method1.invoke(nameSet, s, "name","李四")+"\n"); 


System.out.println("2:"+ 

Method1.invoke(nameSet, s, "age",12)+"\n"); 



System.out.println("将obj对象中名为"

+ "属性名设置为value并且返回出来:");



Method Method11 = c.getDeclaredMethod("setProp",

Student.class,Object.class,Object.class);





System.out.println("1:"+ 

Method11.invoke(nameSet, s, "name","李四")+"\n"); 


System.out.println("2:"+ 

Method11.invoke(nameSet, s, "age",12)+"\n"); 

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}


}


package ClassfanShe;

import java.io.IOException;

import java.io.InputStream;

import java.lang.reflect.InvocationTargetException;

import java.lang.reflect.Method;

import java.util.Properties;


public class TwoFS {


public static void main(String[] args) {

try {


System.out.println("下面是调用add方法:");

Class c = Class.forName("ClassfanShe.Tools");


Object nameSet = c.newInstance();


Method Method1 = c.getDeclaredMethod("add",

Integer.class,Integer.class);




 


System.out.println("1+2="+ Method1.invoke(nameSet, 1,2)+"\n"); 



} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}


}

后记

每次写代码等最好是总结一些重点代码单词或自己总结的语法或自己的理解来记忆,别的方面也要自己学会总结一些自己认为重要的内容。

自己认为常用的,用处大等的就是我所认为重要的。


Java反射:赋值,设置,通过反射调用getter和setter方法,Tools类【诗书画唱】的评论 (共 条)

分享到微博请遵守国家法律