1、什么是反射
动态的加载类,在使用的时候加载进内,通过Class.forName("")将其加载。
示例1:
Person类:
package javastudy;
public class Person {
int age;
String name;
public void display(){
String s=String.format("姓名=%s,年龄=%d",name,age);
System.out.println(s);
}
}
Testit:
package javastudy;
public class Testit {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
// TODO Auto-generated method stub
Class<?> c=Class.forName("javastudy.Person"); //将Person类加载进进来(内存),此时c相当于是Person;<?>是泛型,理解为通配符
Person zhang=(Person)c.newInstance();//新建对象,将object转换为Person
zhang.name="jack";
zhang.age=20;
zhang.display();
}
}
2、反射的其他作用
- 获得这个类实现了哪些接口 getInterfaces
- 得到其父类 getSuperclass
-
得到所有的构造函数 getConstructors
示例2:得到构造函数
Person类
package javastudy;
public class Person {
int age;
String name;
public void display(){
String s=String.format("姓名=%s,年龄=%d",name,age);
System.out.println(s);
}
public Person(){
}
public Person(String name,int age){
this.name=name;
this.age=age;
}
}
Testit类
package javastudy;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
public class Testit {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
// TODO Auto-generated method stub
Class<?> c=Class.forName("javastudy.Person"); //将Person类加载进进来(内存),此时c相当于是Person;<?>是泛型,理解为通配符
// Person zhang=(Person)c.newInstance();//新建对象,将object转换为Person
// zhang.name="jack";
// zhang.age=20;
// zhang.display();
Constructor<?>[] cons=c.getConstructors(); //数组形式存放Person存在的构造函数,可能包含有多个
Person wang=(Person) cons[1].newInstance("jerry",30);//取数组中的[1]第2个函数,因此要将Person中定义为public
wang.display();
}
}
示例3:得到此类实现了哪些接口
新增加一个interface
Animal接口
package javastudy;
public interface Animal {
}
Person类
package javastudy;
public class Person implements Animal{
}
Testit类
package javastudy;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
public class Testit {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
// TODO Auto-generated method stub
Class<?> c=Class.forName("javastudy.Person"); //将Person类加载进进来(内存),此时c相当于是Person;<?>是泛型,理解为通配符
Class<?>[] inter=c.getInterfaces();
for(int i=0;i<inter.length;i++){
System.out.println(inter[i].getName());
}
}
}