本帖最后由 のソ夏末 于 2014-4-17 15:53 编辑
下面的代码主要是针对反射方面的诸多知识点进行强化巩固,用我们非常熟悉的Student类引出反射机制,意在将反射的方方面面集中在一个类中进行解释说明,并由此产生一些疑问。希望各位大牛同学能够帮我解答一下!- package cn.itcast.day1;
- public class Student
- {
- private String name = "zhangsan";
- private int age = 26;
- private String school ="fudandaxue";
- public void shout()
- {
- System.out.println("name: "+name+",age: "+age+",school: "+school);
- }
- private void speak()
- {
- System.out.println("Hello World!");
- }
- public Student()
- {
- }
- public Student(String name, int age) {
- this.name = name;
- this.age = age;
- }
- public Student(String name, int age, String school) {
- this(name,age);
- this.school = school;
- }
- public String toString() {
- return "Student [name=" + name + ", age=" + age + ", school=" + school + "]";
- }
- }
- class TestStudent
- {
- public static void main(String[] args)
- {
- Student stu = new Student("zhaohongchun",26,"fudandaxue");
- stu.shout();
- }
- }
复制代码- package cn.itcast.day1;
- import java.lang.reflect.*;
- public class TestReflect
- {
- public static void main(String[] args) throws Exception {
- //通过反射方式创建Student实例对象。constructor3代表具有三个参数的构造方法。
- Constructor constructor3= new Student().getClass().getConstructor(String.class,int.class,String.class);
- Student stu= (Student)constructor3.newInstance("zhangsan",26,"fudandaxue");
-
- //访问私有属性,并对其数值进行修改。
- Field fieldName = stu.getClass().getDeclaredField("name");
- fieldName.setAccessible(true);
- fieldName.set(stu, "lisi");
- System.out.println(stu);
-
- //访问私有方法speak()。
- Method speakMethod = stu.getClass().getDeclaredMethod("speak");
- speakMethod.setAccessible(true);
- speakMethod.invoke(stu);
-
- //调用未知类startingClassName的main方法。我是用上面的cn.itcast.TestStudent类进行测试。
- String startingClassName = args[0];
- Method mainMethod = Class.forName(startingClassName).getMethod("main",String[].class);
- mainMethod.invoke(null,(Object)new String[]{"1"});
- }
- }
复制代码 问题1:如果用反射方式调用某一个类的main方法时,众所周知是用Method mainMethod = Class.forName(startingClassName).getMethod("main",String[] args),然后用mainMethod.invoke(null,(Object)new String[]{"1"})进行调用,可不可以在不投放参数的情况下调用main方法,就像(null,(Object)new String[]{"1"})中所刻意放进去的new String[]{"1"},我只想获得main方法中的代码,至于放不放参数有些疑问?有人会发问main(String[] args)它的参数列表便是String[]类型的,我们在获得并使用的时候当然要按照它的格式来投放参数,我也知道这一点,有没有这种可能,反射也可以像我们刚开始接触java时候不放任何参数直接对main()方法进行调用?
问题2:反射机制有利有弊
利:引申出框架结构
弊:破坏了面向对象的封装性,可以对类中的私有属性、私有方法进行访问。过多反射会导致程序性能下降。
除了上面的利弊之外,具体还有哪些利弊?请详细说明!
|