反射机制
先建立一个Person类,然后使用反射的一些方法获取Person类的属性和方法
Class<Person> clazz=Person.class;
Person p=clazz.newInstance();
Field f=clazz.getField("name");//反射获取属性
Field f1=clazz.getField("age");
f.set(p, "卷发送到");
f1.set(p, 1231423);
System.out.println(p);
//反射获取方法
Method m1=clazz.getMethod("show");//无参数方法
m1.invoke(p);
Method m2=clazz.getMethod("show", String.class);//有参数的方法
m2.invoke(p, "fjasldjfk");
8.11
反射里面获取私有的指定的属性
Field ff=clazz.getDeclaredField("age");//获取指定的属性
ff.setAccessible(true);//把私有的age设置为可访问的
ff.set(p, 321);
System.out.println(p);
反射里面获取私有的指定的构造器并赋值
Class clazz=Person.class;
Constructor con=clazz.getDeclaredConstructor(String.class,int.class);//获取带有两个参数的构造方法
con.setAccessible(true);//设置为可访问的
Person p=(Person)con.newInstance("jiajia",78);获取可运行时类的构造方法
System.out.println(p);
---------------------------------------------------------
例子:
Person类
package com.lanqiao.javatest;
public class Person {
private String name;
private int age;
public Person() {
super();
}
private Person(String name) {
super();
this.name = name;
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public void show(){
System.out.println("java反射练习题!!");
}
public void show(String vation){
System.out.println("java"+vation);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}
反射的测试方法:
1.
package com.lanqiao.javatest;
import java.lang.reflect.Constructor;
import javax.swing.SpringLayout.Constraints;
public class Test2 {
public static void main(String[] args) throws Exception {
//获取指定的构造器方法
// 方法一
// String className="com.lanqiao.javatest.Person";
// @SuppressWarnings("rawtypes")
// Class clazz=Class.forName(className);
Class clazz=Person.class;
Constructor con=clazz.getDeclaredConstructor(String.class,int.class);
con.setAccessible(true);
Person p=(Person)con.newInstance("jiajia",78);
System.out.println(p);
}
}
2.
package com.lanqiao.javatest;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/*
* Class是java.long.Class包中的;
* */
public class Test1 {
public static void main(String[] args) throws Exception {
Class clazz=Person.class;
Person p=(Person) clazz.newInstance();
Field [] field=clazz.getFields();//获取全部属性
Field ff=clazz.getDeclaredField("age");//获取指定的属性
ff.setAccessible(true);//把私有的age设置为可访问的
ff.set(p, 321);
System.out.println(p);
System.out.println();
for(Field f:field){
System.out.println(f.getType());//获取属性的类型
System.out.println(f.getName());//获取属性的名字
}
System.out.println();
Method[] method=clazz.getDeclaredMethods();//获取全部方法
for(Method m:method){
System.out.println(m.getName());
}
System.out.println();
Method method1=clazz.getDeclaredMethod("show",String.class);//获取指定方法
method1.invoke(p, "show");
}
}