java反射机制:
反射机制是一个动态机制,它允许我们程序在[运行期间]再确定实例化,方法的调用,属性的操作等。
由此可知:
1)反射的优点可以使程序的灵活度大大提高;
2)随之而来的缺点便是增加了系统的开销降低了运行效率。
因此,反射机制不能被过渡使用
Demo1
使用反射机制的第一步:获取要操作的类对象,即:Class的实例。
JVM中被加载的类都有且只有一个Class的实例与之对应,该实例就称为被加载的这个类的类对象。
类对象上会记录着其表示的类的一切信息(类名,方法信息,属性信息等)
获取一个类的类对象方式:
1:类名.class:
//Class cls = String.class;
Class cls = int.class;
2:Class.forName(String className)
Class cls = Class.forName("java.lang.String");
参数要求是要加载的类的完全限定名:包名+类名
3.类加载器ClassLoader形式加载
public class ReflectDemo1 {
public static void main(String[] args) throws ClassNotFoundException {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一个类名:");
String className = scanner.nextLine();
Class cls = Class.forName(className);
//通过类对象获取String的一切信息
System.out.println(cls.getName());//获取类名
System.out.println(cls.getSimpleName());//查看类名
Package p = cls.getPackage();//获取该类的包名
System.out.println("包名:"+p.getName());
/*
Class称为类对象,其每一个实例用于表示一个类的信息
Method称为方法对象,其每一个实例用于表示一个方法的信息
通过Method可以:
获取一个方法的所有信息(方法名,参数信息,返回值类型,访问修饰符等),可以通过对象执行这个方法。
*/
Method[] methods = cls.getMethods();
for(Method method:methods){
System.out.println(method.getName());
}
}
}
控制台部分结果展示:
Demo2
使用反射机制实例化对象:
反射机制实例化对象 1:加载要实例化对象的类的类对象 2:利用类对象来实例化
public class ReflectDemo2 {
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
Person p = new Person();
System.out.println(p);
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一个类名:");
String className = scanner.nextLine();
Class cls = Class.forName(className);
Object obj = cls.newInstance();
System.out.println(obj);
}
}
结果展示:
Demo3
使用指定构造器实例化对象
为了方便演示,我们需要创建一个Person类
package reflect;
public class Person {
private String name = "张三";
private int age = 18;
public Person(){}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public void sayHello(){
System.out.println(name+"说:hello!");
}
public void watchTV(){
System.out.println(name+":正在看电视");
}
public void sing(){
System.out.println(name+":正在唱歌");
}
public void playGame(){
System.out.println(name+":正在打游戏");
}
public void eat(){
System.out.println(name+":正在干饭!");
}
public void say(String info){
System.out.println(name+"说:"+info);
}
public void say(String info,int count){
for(int i=1;i<=count;i++) {
System.out.println(name + "第"+i+"次说:" + info);
}
}
private void heihei(){
System.out.println("我是Person的私有方法!!!!!!");
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
public class ReflectDemo3 {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
Person p = new Person("李四",22);
System.out.println(p);
Class cls = Class.forName("reflect.Person");
// cls.getConstructor();//不传参数时,获取的就是无参构造器
/*
Constructor对象的每一个实例用于表示一个构造器
*/
//Person(String,int)
Constructor c = cls.getConstructor(String.class,int.class);
//new Person("王五",33);
Object obj = c.newInstance("王五",33);
System.out.println(obj);
}
}