反射
使用反射获得Class类
Class cls = Class.forName("全类名") //包括包名
Class cls = xx.Class;//xx代表类名
Class cls = 对象.getClass();
使用反射获得构造方法
有个构造方法如:
public Book(String bookName, String author,double price) {
this.bookName = bookName;
this.author = author;
this.price = ((int) price);
}
在使用反射来获得的构造方法的时候需要与构造方法中的参数类型进行对应
Constructor declaredConstructor = cls.getDeclaredConstructor(String.class, String.class, double.class);
//或者使用包装类的静态常量TYPE,表示的是该包装类的基本类型
Constructor declaredConstructor = cls.getDeclaredConstructor(String.class, String.class, Double.TYPE);
使用反射获得一个对象实例
例如
Student student = cls.newInstance();
使用反射获得属性名(字段名,成员变量名)
以下的方法都是返回Field数组
-
getDeclaredFields()
返回所有的字段名,但不包括继承的属性名(字段名,成员变量名) -
getFields()
返回所有的字段名,包括继承的属性名(字段名,成员变量名)
使用反射获得方法
以下两种方法均是返回一个Method数组
-
cls.getMethods()
包括继承的方法 -
cls.getDeclaredMethods()
不包括继承的方法 -
cls.getMethod(String name,parameterTypes)
返回指定方法名的Method,name为方法名,后面参数为该方法的参数列表,参数列表记得按照顺序
获得类中某个方法的返回类型
-
method.getReturnType()
返回该方法的返回类型,是一个Class对象(返回类型对应的class)
//如
public String hello(){
...
};
method.getReturnType();//返回的就是java.lang.String
-
method.getGenericReturnType()
返回的是一个Type类对象
使用反射调用方法
-
method.invoke(Object o...)
Object是参数列表
获得类中getXxx方法并调用
获得所有的字段名,根据字段名拼接成正确的getXxx方法名,之后获得指定方法名的Method,之后调用即可
Student student = new Student();
Class<? extends Student> c1 = student.getClass();
Field[] declaredFields = c1.getDeclaredFields();
for (Field declaredField : declaredFields) {
String name = declaredField.getName();
//使用IDEA生成的set/get方法都是遵循驼峰命名法,我们的命名也得按照驼峰命名法
//这样,我们只需要把第一个单词的开头字母转为大写的字母即可获得正确的方法名,之后调用即可
String a = name.substring(0, 1).toUpperCase();//首字母大写
String b = name.substring(1);//截取剩余的字符串
Method method = c1.getMethod("get" + a+b);//拼接,并查找匹配的方法
method.invoke();
}
list 迭代器
listiterator和iterator
listiterator继承iterator,是iterator的增强版
listiterator可以双端遍历,通过list.listIterator()
方法返回,方法中可以带一个指定下标的数,比iterator要方便
如果想要从末尾向前找,可以定义迭代器的开始为list的末尾,之后往前查找
ListIterator listIteratorlists.listIterator(lists.size());
while (listIterator.hasPrevious()) {
System.out.println(listIterator.previous());
}