java反射
人贵有自知之明。不会的立马去学。忘记的立马去补。
由于我的反射是1年前学的。很多东西都已忘记。昨日阿里面试提起反射。我只迷糊的记得有Class.forName和getMethod、newInstant这些东西。
其实我觉得java这些东西内部知识很多。Spring我知道是反射。大概怎么做的我也清楚。但若离开了Eclipse离开了intellij让我空手写代码确实没有API文档我真不行。
下面我简单的回顾了一下反射。Spring的AOP面向切面编程。我喜欢叫面向接口。不管怎样。大致上这种框架都是在spring.xml中配置bean。现在也有很多程序不喜欢配置。而更喜欢用注解的形式什么@Service、@Controller、@Resource之类的注解。通过注解的组合达到0配置的目的。但大意都是基于反射实现的。
例如我们先写个简单的Pojo
public class Student { private String name; public Student(){} public Student(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
之后我们再写个测试类
import java.lang.reflect.Constructor; import java.lang.reflect.Method; public class test { /** * @param args */ public static void main(String[] args) throws Exception { Class cls_1 = Class.forName("Student"); //通过名称获取Class,这里一般是需要有包名前缀的。 Class cls_2 = Student.class; //直接通过.class文件获取Class if(cls_1.equals(cls_2)) System.out.println("this is sample Class"); Student stu = (Student)cls_1.newInstance(); //通过无参构造方法new获取对象,若无空参构造方法会抛异常 Constructor<Student> sc = cls_1.getConstructor(String.class); //若类中不含无参构造方法则会抛异常这里就需要先获取指定的构造方法 Student stu2 = sc.newInstance("haha"); System.out.println(stu2.getName()); Method me1 = cls_1.getMethod("setName", String.class); //通过名称+参数类型的class获取Method方法 me1.invoke(stu, "jungle"); //调用指定实例的指定参数 System.out.println(stu.getName()); } }
运行结果
this is sample Class jungle haha
是不是很简单呢。其实我觉得各种语言学多了不免忘记。但查API文档和原理懂就行了。空手写代码的除了上个世纪80、90年代那个用Dos用打孔机写代码的年代。java东西这么多。常用的记住忘记查文档。更好得利用资源例如StackOverflow这种东西。不扯了。我是水货233333