Java——反射基础
一个类是由成员变量(字段)、方法、构造器等部分组成的,反射的概念就是通过加载类、解剖类的各个组成部分,从而实现对类的各个部分的操作。涉及的类主要有Class、Method、Constructor、Field等。
- 加载类的三种常用方法:
- Class c = Class.forName(path);//path是要加载类的包路径
- Class c = Person.getClass();//Person是要加载的类
- Class c = Person.class;
- 解剖类的各个组成部分
package com.kexin.day1;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import org.junit.Test;
public class Demo3 {
/*
* 使用反射机制获取类的构造函数,并创建实例
*/
@Test
public void test() throws Exception{
//获取不带参反射类构造函数public Person()
Class class1 = Class.forName("com.kexin.day1.Person");
Constructor c = class1.getConstructor(null);
Person p = (Person) c.newInstance(null);
}
@Test
public void test1() throws Exception{
//获取带参反射类构造函数public Person(String name)
Class class1 = Class.forName("com.kexin.day1.Person");
Constructor c = class1.getConstructor(String.class);
Person p = (Person) c.newInstance("Tom");
}
@Test
public void test2() throws Exception{
//获取私有构造函数private Person(long ID)
Class class1 = Class.forName("com.kexin.day1.Person");
Constructor c = class1.getDeclaredConstructor(long.class);
c.setAccessible(true);//强制访问
Person p = (Person) c.newInstance(123456);
}
@Test
public void test3() throws Exception{
//获取无参反射类函数public void Run()
Person p = new Person();
Class class1 = Class.forName("com.kexin.day1.Person");
Method m = class1.getMethod("Run",null);
m.invoke(p, null);
}
@Test
public void test4() throws Exception{
//获取含参反射类函数public int Run(int v)
Person p = new Person();
Class class1 = Class.forName("com.kexin.day1.Person");
Method m = class1.getMethod("Run",int.class);
int n = (int) m.invoke(p, 22);
System.out.println(n);
}
@Test
public void test5() throws Exception{
//获取含参反射类私有函数private void Eat()
Person p = new Person();
Class class1 = Class.forName("com.kexin.day1.Person");
Method m = class1.getDeclaredMethod("Eat",null);
m.setAccessible(true);
m.invoke(p, null);
}
@Test
public void test6() throws Exception{
//获取反射类静态函数public static void Eat(String name)
Person p = new Person();
Class class1 = Class.forName("com.kexin.day1.Person");
Method m = class1.getDeclaredMethod("Eat",String.class);
m.invoke(null,"Tom");
}
@Test
public void test7() throws Exception{
//获取反射类字段
Person p = new Person();
Class class1 = Class.forName("com.kexin.day1.Person");
Field f = class1.getField("age");
Class type = f.getType();
if(type.equals(int.class))
System.out.println(f.get(p));
}
@Test
public void test8() throws Exception{
//获取反射类私有字段
Person p = new Person();
Class class1 = Class.forName("com.kexin.day1.Person");
Field f = class1.getDeclaredField("name");
f.setAccessible(true);
Class type = f.getType();
if(type.equals(String.class)){
System.out.println(f.get(p));
f.set(p, "Jerry");
System.out.println(f.get(p));
}
}
}
Person类:
package com.kexin.day1;
public class Person {
private String name = "Tom";
public int age = 10;
public Person(){
System.out.println(name);
}
public Person(String name){
this.name = name;
System.out.println("I am "+name);
}
private Person(long ID){
System.out.println(name + "'s ID is "+ID);
}
public void Run(){
System.out.println(name + " is Running");
}
public int Run(int v){
System.out.println(name + "'s vate is "+v+"km/h");
return 1;
}
private void Eat(){
System.out.println(name + " is Eating");
}
public static void Eat(String name){
System.out.println(name + " is Eating");
}
}