学会动态实例化对象、学会取得类的构造方法信息,并使用

61 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

1.写一个 Emp 类, 即职员类 在 main 方法中 用三种方法,取得 Emp 类的类信息,并输出 使用 newInstance()对这个类进行实例化,并调用这个对象

实现代码:

 package com.zhangyufan.reflect;
 ​
 public class TestNewInstance {
 ​
     public static void main(String[] args)
             throws ClassNotFoundException, InstantiationException, IllegalAccessException {
         Class c = Emp.class;
         System.out.println("通过类的class属性获取Emp类的类信息:" + c);
         Emp e = new Emp();
         c = e.getClass();
         System.out.println("通过对象的getClass()方法获取Emp类的类信息:" + c);
         c = Class.forName("com.zhangyufan.reflect.Emp");
         System.out.println("通过Class对象的静态方法forName()获取Emp类的类信息:" + c);
         Object obj = c.newInstance();
         if (obj instanceof Emp) {
             Emp emp = (Emp) obj;
             emp.setName("王老师");
             emp.setAge(30);
             System.out.println(obj);
         }
     }
 ​
 }
 ​
 class Emp {
     private String name;
     private int age;
 ​
     public String getName() {
         return name;
     }
 ​
     public void setName(String name) {
         this.name = name;
     }
 ​
     public int getAge() {
         return age;
     }
 ​
     public void setAge(int age) {
         this.age = age;
     }
 ​
     @Override
     public String toString() {
         return name + "," + age;
     }
 }

运行结果: 在这里插入图片描述

  1. 定义一个类 Animal 定义 4 个构造方法 带一个参数 带一个可变参数 带二个参数 带三个参数,其中一个是可变参数 使用反射的方式,做一个通用版动态实例化方法 可以处理不同的方法参数

实现代码:

 package com.zhangyufan.reflect;
 ​
 import java.lang.reflect.Constructor;
 import java.lang.reflect.InvocationTargetException;
 ​
 public class TestConstructor {
 ​
     public static void main(String[] args)
             throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
         Class cl = Animal.class;
         Constructor[] cs = cl.getConstructors();
         for (Constructor c : cs) {
             Class[] cps = c.getParameterTypes();
             Object[] o = new Object[cps.length];
             for (int i = 0; i < cps.length; i++) {
                 String name = cps[i].getName();
                 System.out.println(name);
                 if ("java.lang.String".equals(name)) {
                     o[i] = "老虎";
                 }
                 if ("int".equals(name)) {
                     o[i] = 8;
                 }
                 if ("[Ljava.lang.String;".equals(name)) {
                     o[i] = new String[] { "小狗", "小猫", "羊驼" };
                 }
             }
             Animal a = (Animal) c.newInstance(o);
             System.out.println(a);
             System.out.println("------------------------------------------------");
         }
     }
 ​
 }
 ​
 class Animal {
     private String name;
     private int age;
 ​
     public String getName() {
         return name;
     }
 ​
     public void setName(String name) {
         this.name = name;
     }
 ​
     public int getAge() {
         return age;
     }
 ​
     public void setAge(int age) {
         this.age = age;
     }
 ​
     @Override
     public String toString() {
         return name + "," + age;
     }
 ​
     public Animal(String name) {
         this.name = name;
         System.out.println("调用带name参数的构造方法");
     }
 ​
     public Animal(String... na) {
         this.name = "";
         for (int i = 0; i < na.length; i++) {
             this.name += na[i];
             if (i < na.length - 1) {
                 this.name += ",";
             }
         }
         System.out.println("调用带可变参数na的构造方法");
     }
 ​
     public Animal(String name, int age) {
         this.name = name;
         this.age = age;
         System.out.println("调用带name,age参数的构造方法");
     }
 ​
     public Animal(String name, int age, String... na) {
         this.name = name;
         this.age = age;
         this.name += ",";
         for (int i = 0; i < na.length; i++) {
             this.name += na[i];
             if (i < na.length - 1) {
                 this.name += ",";
             }
         }
         System.out.println("调用带name,age参数以及一个可变参数na的构造方法");
     }
 }

运行结果:

在这里插入图片描述