感兴趣的小伙伴可以先看看我的这篇文章哦,打开看看,说不定能帮到你一些~~
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;
}
}
运行结果:
2. 定义一个类 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的构造方法");
}
}
运行结果: