您的位置:首页 > 编程语言 > Java开发

Java自学之路-Java基础教程-48:Java的反射机制Reflection

2018-03-20 22:42 651 查看
反射是什么意思?比如一个Java类文件HelloWorld.java,打开这个文件我们很容易看到这个类里面有哪些方法,哪些变量属性,但是如何能让正在运行的程序知道这个类有哪些方法,哪些属性呢?如果想改变这个类的一些方法,或在程序里给这个类增加一些方法或属性,是不是可以让程序动态地修改?Java提供的java.lang.reflect包中的类可以做到这些,比如获取这个类的包名,所有方法的名称,方法的返回类型或参数,类名等等。​
1,获取类名。比如要获取ArrayList这个类的类名。 Class c = Class.forName("java.util.ArrayList");
System.out.println(c.getName());
System.out.println(c.getSimpleName());
打印出来结果就是:java.util.ArrayList
ArrayList
获取Class也可以直接使用Class ac = ArrayList.class;
2,获取所有属性变量: Field[] fields = c.getDeclaredFields();
for (Field field : fields) {
System.out.println(field);
}
这里使用getDeclaredFields()取到所有的变量声明,返回的类型是一个Field类型的数组,使用for循环把所有的方法打印出来。这里用了一种:冒号表达式,比之前int i=0;i<=fields.length;i++这种条件表达式更简洁一些。打印的结果为:private static final long java.util.ArrayList.serialVersionUID
private static final int java.util.ArrayList.DEFAULT_CAPACITY
private static final java.lang.Object[] java.util.ArrayList.EMPTY_ELEMENTDATA
private transient java.lang.Object[] java.util.ArrayList.elementData
private int java.util.ArrayList.size
private static final int java.util.ArrayList.MAX_ARRAY_SIZE打开java.util.ArrayList这个类的源代码,其实这些打印出来的属性变量都是存在的。这里还可以修改属性的访问限制,比如method.setAccessible(true);
3,获取所有方法名: Method[] methods = c.getDeclaredMethods();
for (Method method : methods) {
System.out.println(method);
}
使用getDeclaredMethods()方法可以获取到这个类的所有方法声明,同样也返回存在Method类型的数组里面。循环打印出所有的方法结果为:public java.lang.Object java.util.ArrayList.clone()
public boolean java.util.ArrayList.add(java.lang.Object)
public void java.util.ArrayList.add(int,java.lang.Object)
public boolean java.util.ArrayList.contains(java.lang.Object)
public java.lang.Object java.util.ArrayList.get(int)
4,获取类的包名Package p = c.getPackage();
System.out.println(p.getName());
使用getPackage()方法可以获取这个类的包名,返回类型为Package,再使用Package的getName()方法就可以了。
5,获取所有构造方法 Constructor[] constructors = c.getConstructors();
for (Constructor constructor : constructors) {
System.out.println(constructor);
}
同获取所有属性或方法一样,getConstructors返回Constructor类型的数组,循环这个数组可以得到所有的构造方法。
6,获取所有注解 Annotation[] annotations = c.getAnnotations();
for (Annotation annotation : annotations) {
System.out.println(annotation);
}
注解现在还没有涉及过,以后用框架时会经常用到注解Annotation。比如某上类或方法或属性变量上面有个@符号,这个@符号的部分就是注解了。常用的注解比如@Component,@Service,@Repository,@Autowired,@RequestMapping,@Controller等等这样的形式。
7,新建实例对象 Object newInstance = c.newInstance();
List listInstance = (List) newInstance;
listInstance.add("123");
listInstance.add("456");
for (String str : listInstance) {
System.out.println(str);
}
使用Class类的newInstance()方法也可以创建一个类的实例或对象,这和new关键字所产生的对象一样用。newInstance()方法返回的是Object对象,而Object是所有类的根类,c又是java.util.ArrayList类型的类,所以完全可以把创建的对象强转为List类型,并且可以使用泛型规定List中存储String类型的对象。这样在List的对象中增加String的数据,再使用冒号表达式循环取出List中的内容。



具有OCR和ASR功能,可以识别图片和录音中文字,并有多国语言翻译功能,可以作为便签或笔记,类似微博的图文应用
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐