泛型和反射

一、泛型
* 泛型在方法上的使用
* 实现数组指定位置值得交换
public static <T> void swap(T[] arr,int i,int j){
T temp= arr[i];
arr[i]=arr[j];
arr[j]=temp;
}

Integer[] arr = {1,2,3,4,5};
System.out.println(Arrays.toString(arr));
swap(arr,1,3);
System.out.println(Arrays.toString(arr));
二、反射
* 首先获取到Class类
- 三种方式
Class c1 = Person.class;
Class c2 = new Person().getClass();
Class c3 = Class.forName("com.gem.test.Person");
* 对一个类进行实例化  而不是用new  怎么获取

获取Class
Class c3 = Class.forName("com.gem.test.Person");
得到Person类的实例

Person p =(Person) c3.newInstance();


* 操作无参的构造方法
public void test1() throws Exception {
获取Class
Class c3 = Class.forName("com.gem.test.Person");
得到Person类的实例
Person p =(Person) c3.newInstance();
设置值
p.setName("rose");
System.out.println(p.getName());
}
* 操作有参的构造方法
public void test2() throws Exception{
// 得到Class
Class c1 = Class.forName("com.gem.test.Person");
// 使用有参的构造方法
// c1.getConstructors();// 获取有参的构造方法
// 传递室友餐的构造方法里面的参数类型,类型使用class形式传递
Constructor cs = c1.getConstructors(String.class,String.class);
// 通过构造方法哎设置值
// 通过有参的构造方法来创建Person实例
Person p1 = (Person) cs.newInstance("100","rose");
System.out.println(p1.getId()+":"+p1.getName());
}

* 操作属性
public void test3() throws Exception{
// 得到Class
Class c2 = Class.forName("com.gem.test.Person");
// 得到name属性
// c2.getDeclaredFields(); // 表示得到所有的属性
// 得到Person类的实例
Person p2 = (Person) c2.newInstance();
// 通过这个方法得到属性,参数是属性的名称
Field f1 = c2.getDeclaredField("name");
// 操作的属性是私有,要设置成可以操作的属性
f1.setAccessible(true);
// 设置name的值
f1.set(p2,"wangwu"); // 相当于p2.name="wangwu"
System.out.println(f1.get(p2)); // 相当于 p2.name
}

* 操作普通方法,比如操作setName
public void test3() throws Exception{
// 得到Class
Class c4 = Class.forName("com.gem.test.Person");
// 得到Person类的实例
Person p4 = (Person) c4.newInstance();
// 得到普通方法
// c4.getDeclaredMethods();// 得到所有的普通方法
// 传递两个参数,第一个是方法名称,第二个是通过方法设置的值
Method m1 = c4.getDeclaredMethod("setName",String.class);
// 执行设置的值
m1.invoke(p4,"niuqi");
System.out.println(p4.getName());

猜你喜欢

转载自blog.csdn.net/qq_34668848/article/details/80989901