java类反射机制创建对象

public class Person {
 private String name;
 private int age;
 public Person(String name,int age){
 this.name = name;
 this.age = age;
 }
 public Person(){
 }
 public String getName(){
 return name;
 }
 public int getAge(){
 return age;
 }
 public void setName(String name){
 this.name = name;
 }
 public void setAge(int age){
 this.age = age;
 }
 private void test(String name,int age){
 this.name = name;
 this.age = age;
 System.out.println("反射机制操作private方法得到的名字:" + name + ",年龄:" + age);
 }
}

class CreateObject{
 /*
 *反射机制是指:把java类中的各种成分映射成相应的java类,然后可以获取这个类的所有信息
 */
 public static void createObj1() throws Exception{
 Class classType = CLass.forName("shiliu.Person");
 Object obj = classType.newInstance();
 System.out.println("使用反射机制创建的对象是否是Person类的对象:" + (obj instanceof Person));
 }
 
 /*
 *创建带有构造参数的对象的时候需要另一种方式:
 *1.先获取操作类的class对象的字节码
 *2.使用class对象的getConstructor(parameterTypes)方法获取该对象的构造方法的对象
 *3.使用构造方法的对象的newInstance(initargs)方法可以实例化一个对象
 */
 public static void createObj2() throws Exception{
 Class classType = Person.class;
 Constructor<Person> con = classType.getConstuctor(String.class,int.class);
 Object obj = con.newInstance("niubi",22);
 System.out.println("使用Constructor对象的newInstance方法创建对象的信息,名字:"+((Person) obj).getName() +" 年龄:" + ((Person) obj).getAge());
 System.out.println("使用Constructor对象的newInstance方法创建的对象是否是Person类的对象:" + (obj instanceof Person));
 }
 
 /*
 *操作方法包括private方法
 *1.首先获取操作类的class对象
 *2.通过class对象的getMethod方法获取要操作的方法的Method对象(第一个参数是方法名,第二个是参数类型)
 *3.调用Method的invoke方法(第一个参数是该方法属于的类对象,第二个是具体参数)
 *4.当方法被private修饰时,首先要调用getDeclaredMethod方法获取要操作的方法的Method对象,再通过setAccessible方法获得操作权限
 *5.对private字段的操作,要调用getDeclaredFiled方法
 */
 public static void methodDo() throws Exception{
 Person p = new Person();
 Class classType = Person.class;
 Method method = classType.getMethod("setName",String.class);
 method.invoke(p,"shiliu");
 System.out.println("使用反射操作setName方法后,Person对象的name值是:" + p.getName());
 
 Method method2 = classType.getDeclaredMethod("test",new Class[]{String.class,int.class});
 method2.setAccessible(true);
 method2.invoke(p,new Object[]{"liu",20});
 }
 
 public static void main(String args[]) throws Exception{
 new CreateObject().createObj1();
 new CreateObject().createObj2();
 new CreateObject().methodDo();
 }
}



结果:
使用反射机制创建的对象时候是Person类的对象:true
使用Constructor对象的newInstance方法创建对象的信息,名字:niubi 年龄:22
使用Constructor对象的newInstance方法创建的对象是否是Person类的对象:true
使用反射操作setName方法后,Person对象的name值是:shiliu
反射机制操作private方法得到的名字:liu,年龄:20
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值