java 中,定义一个Class,然后就可以通过new 关键字,将Class 实例化,从而得到一个实例对象;
那么反射,刚好相反,是通过一个Class的实例对象,来得到Class 类的相关信息.
实例1: 通过一个实例对象,获得完整的包名和类名
[
java]
package org.zhang.test;
class Demo{
}
public class ReflectTest {
public static void main(String[] args) {
Demo demo = new Demo();
System.out.println(demo.getClass().getName());
}
}
运行结果:org.zhang.test.Demo
实例2:所有类的对象都是Class 的实例
[
java]
package org.zhang.test;
class Demo {
}
public class ReflectTest {
public static void main(String[] args){
Class<?> c1 = null;
Class<?> c2 = null;
Class<?> c3 = null;
try {
c1 = Class.forName("org.zhang.test.Demo");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
c2 = (new Demo()).getClass();
c3 = Demo.class;
assert c1 != null;
System.out.println(c1.getName());
System.out.println(c2.getName());
System.out.println(c3.getName());
}
}
结果:
org.zhang.test.Demo
org.zhang.test.Demo
org.zhang.test.Demo
其中:Class<?> 等同于 Class。 定义泛型的时候,如:class User<T> { }
实例3: 通过Class,实例化 类的对象
[
java]
package org.zhang.test;
class Person{
private String name;
private int age;
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + 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;
}
}
public class ReflectTest {
public static void main(String[] args){
Class<?> personClass = null;
Person person = null;
try {
personClass = Class.forName("org.zhang.test.Person");
person = (Person) personClass.newInstance();
} catch (ClassNotFoundException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
} catch (InstantiationException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
} catch (IllegalAccessException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
assert person != null;
person.setName("zhangwenan");
person.setAge(25);
System.out.println(person);
}
}
结果:
Person{name='zhangwenan', age=25}
实例4:通过Class 调用不同的构造方法
[
java]
package org.zhang.test;
import
java.lang.reflect.Constructor;
import
java.lang.reflect.InvocationTargetException;
class Person{
private String name = "no name";
private int age = 0;
public Person(String name) {
this.name = name;
}
public Person(int age) {
this.age = age;
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public Person() {
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + 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;
}
}
public class ReflectTest {
public static void main(String[] args){
Class<?> personClass = null;
Person person1 = null;
Person person2 = null;
Person person3 = null;
Person person4 = null;
Constructor constructors[] = new Constructor[4];
try {
personClass = Class.forName("org.zhang.test.Person");
} catch (ClassNotFoundException e) {
System.out.println("没有找到Person 类");
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
if (personClass != null) {
try {
constructors[0] = personClass.getConstructor();
constructors[1] = personClass.getConstructor(String.class);
constructors[2] = personClass.getConstructor(int.class);
constructors[3] = personClass.getConstructor(String.class, int.class);
person1 = (Person) constructors[0].newInstance();
person2 = (Person) constructors[1].newInstance("shiwoo");
person3 = (Person) constructors[2].newInstance(25);
person4 = (Person) constructors[3].newInstance("shiwoo", 25);
System.out.println(person1);
System.out.println(person2);
System.out.println(person3);
System.out.println(person4);
} catch (NoSuchMethodException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
} catch (InstantiationException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
} catch (IllegalAccessException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
} catch (InvocationTargetException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
}
}
}
结果:
Person{name='no name', age=0}
Person{name='shiwoo', age=0}
Person{name='no name', age=25}
Person{name='shiwoo', age=25}
实例5:获取某个类所实现的所有接口
[
java]
package org.zhang.test;
import
java.lang.reflect.Constructor;
import
java.lang.reflect.InvocationTargetException;
interface Chiness{
void say();
}
class Person implements Chiness{
@Override
public void say() {
System.out.println("我是中国人");
}
}
public class ReflectTest {
public static void main(String[] args){
Class<?> personClass = null;
Class<?>[] interfaces = null;
try {
personClass = Class.forName("org.zhang.test.Person");
interfaces = personClass.getInterfaces();
for (Class<?> c : interfaces){
System.out.println(c.getName());
}
} catch (ClassNotFoundException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
}
}
结果:
org.zhang.test.Chiness
实例6:获取父类
[
java]
public class ReflectTest {
public static void main(String[] args){
Class<?> personClass = null;
Class<?> superClass = null;
try {
personClass = Class.forName("org.zhang.test.Person");
superClass = personClass.getSuperclass();
System.out.println(superClass.getName());
} catch (ClassNotFoundException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
}
}
结果:
java.lang.Object
实例7:获取修饰符、方法、返回类型等
[
java]
package org.zhang.test;
import
java.lang.reflect.Constructor;
import
java.lang.reflect.Method;
import
java.lang.reflect.Modifier;
interface Chiness{
void say();
}
class Person implements Chiness{
public Person(){
}
@Override
public void say() {
System.out.println("我是中国人");
}
}
public class ReflectTest {
public static void main(String[] args){
Class<?> personClass = null;
Constructor constructor = null;
Constructor constructor2 = null;
try {
personClass = Class.forName("org.zhang.test.Person");
constructor = personClass.getDeclaredConstructor();
constructor2 = personClass.getConstructor();
System.out.println(constructor);
System.out.println(constructor2);
int modifier = constructor.getModifiers();
System.out.println("int modifier is: " + modifier);
System.out.println("string modifier is: " + Modifier.toString(modifier));
Method method = personClass.getMethod("say");
int methodModifier = method.getModifiers();
System.out.println(methodModifier);
System.out.println(Modifier.toString(methodModifier));
System.out.println(method.getReturnType());
} catch (ClassNotFoundException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
} catch (NoSuchMethodException e){
e.printStackTrace();
}
}
}
摘自 小长弓