主要来讲讲反射,反射挺重要,如果只做web开发工作,有可能用不太到反射,但是要做安卓开发的话,反射技术就显得非常重要了。
反射听起来挺抽象的一个东西,其实也不是很难。反射就相当于解剖,就好比把电视机比作一个类,叫做TV。那么,电视机里面有很多的功能,像发音功能,播放功能,这些功能就相当于JAVA中类里面的方法。speak()、play()...但是就像电视机一样,类是封装起来的,我们看不见里面的内容,反射做的工作就是把这个类解剖,看看里面到底有什么东西。这就是反射。
类有很多成员组成:字段、方法、构造方法、main()
1、反射类的构造函数Construtor
//反射Person类的构造函数Person()
@Test
public void test2() throws Exception{
Class clazz = Class.forName("net.csdn.reflect.Person");
Constructor c = clazz.getDeclaredConstructor(null);
System.out.println(c.getModifiers());
System.out.print("前面");
System.out.print(new Modifier().toString(c.getModifiers()));
System.out.println("后面");
//当构造函数前面都有public修饰的时候,反射构造函数的时候调用getConstructor(参数);
//当构造函数前面什么都没有加的时候,反射构造函数的时调用getDeclaredConstructor(参数);
Person p = (Person)c.newInstance(null);
System.out.println(p.name);
}
//
//反射Person类的构造函数public Person(String name)
@Test
public void test3() throws Exception{
Class clazz = Class.forName("net.csdn.reflect.Person");
Constructor c = clazz.getConstructor(String.class);
System.out.println(new Modifier().toString(c.getModifiers()));
//Modifier()修正类,修正的人
//里面有一个toString()方法
//功能是传入一个int值,就会返回一个对应的修饰符public或者private等
//有了构造函数,创建对象
Person p = (Person)c.newInstance("李盼乐和朱俊霏");
System.out.println(p.name);
}
//反射Person类得构造函数private Person(String name,int password)
@Test
public void test4() throws Exception{
Class clazz = Class.forName("net.csdn.reflect.Person");
Constructor c = clazz.getDeclaredConstructor(String.class,int.class);
c.setAccessible(true);//强盗一把
Person p = (Person)c.newInstance("好人",23);
System.out.println();
}
2、反射类的方法Method
//反射Person类得方法public void sleep()
@Test
public void test1() throws Exception{
Class clazz = Class.forName("net.csdn.reflect.Person");
Method m = clazz.getMethod("sleep",null);
Person p = new Person();
System.out.println(m.invoke(p, null));
}
//反射Person类的方法private String sleep(String name)
@Test
public void tes2() throws Exception{
Class clazz = Class.forName("net.csdn.reflect.Person");
Method m = clazz.getDeclaredMethod("sleep",String.class);//private方法要调用getDeclareMethod()
//因为方法的修饰符是私有的,所以要进行private修饰
m.setAccessible(true);
Person p = new Person();
System.out.println(m.invoke(p, "朱玲均"));
}
//反射person类的方法public Class[] sleep(String name,int[] password)
@Test
public void test3() throws Exception{
Class clazz = Class.forName("net.csdn.reflect.Person");
Method m = clazz.getMethod("sleep",String.class,int[].class);
Person p = new Person();
m.invoke(p, "haha",new int[]{1,2,3,4});
}
3、反射类的main()方法
@Test
public void test1() throws Exception{
Class clazz = Class.forName("net.csdn.reflect.Person");
Method m = clazz.getMethod("main", String[].class);
//clazz.getDeclaredMethod(name, parameterTypes)
//Person p = new Person();
//m.invoke(p,new String[]{"one","two","three"});
//因为main方法使静态的,所以无需传对象,传了也没关系
m.invoke(null, new Object[]{new String[]{"one","two","three"}});
}
4、反射类的字段Field
public static void main(String[] args) throws Exception {
Class newfm=Class.forName("net.csdn.reflect.fm");
Field fields[]=newfm.getDeclaredFields();
for(int i=0;i<fields.length;i++)
System.out.println(fields[i].getName());
}
学习中