反射的自我介紹
*獲取class物件的方式

package Demo;
public class Person {
private String name;
private int age;
public int a;
public int b;
@Override
public String toString() {
return "Peroson{" +
"name='" + name + '\'' +
", age=" + age +
", a=" + a +
", b=" + b +
'}';
}
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;
}
public int getA() {
return a;
}
public void setA(int a) {
this.a = a;
}
public int getB() {
return b;
}
public void setB(int b) {
this.b = b;
}
public Person(String name, int age, int a, int b) {
this.name = name;
this.age = age;
this.a = a;
this.b = b;
}
public Person() {
}
}
import Demo.Person;
public class Main{
public static void main(String[] args) throws Exception {
//第一種方式 Class.forname("全類名");
Class cls1 = Class.forName("Demo.Person");
System.out.println(cls1);//class Demo.Person
//第二種方式 類名.class
Class cls2 = Person.class;
System.out.println(cls2);//class Demo.Person
//第三種方式 物件.getClass()
Person p=new Person();
Class cls3= p.getClass();
System.out.println(cls3);//class Demo.Person
}
}
*class物件的功能
1.0獲取成員變數
import Demo.Person;
import java.lang.reflect.Field;
public class Main{
public static void main(String[] args) throws Exception {
Class cls = Person.class;
Field[] fields = cls.getFields();//Public 修飾的成員變數
for (Field field : fields) {
System.out.println(field);
}
System.out.println("---------------------");
Field[] fields1 = cls.getDeclaredFields();//所有的成員變數
for (Field field : fields1) {
System.out.println(field);
}
Field age = cls.getDeclaredField("age");
System.out.println(age);
Person p=new Person();
age.setAccessible(true);//暴力反射
age.set(p,18);
Object o = age.get(p);
System.out.println(o);
}
}
列印結果:
public int Demo.Person.a
public int Demo.Person.b
---------------------
private java.lang.String Demo.Person.name
private int Demo.Person.age
public int Demo.Person.a
public int Demo.Person.b
private int Demo.Person.age
18
2.0 獲取構造方法

import Demo.Person;
import java.lang.reflect.Constructor;
public class Main{
public static void main(String[] args) throws Exception {
Class cls = Person.class;
Constructor constructor = cls.getConstructor(String.class, int.class, int.class, int.class);
Object v = constructor.newInstance("V", 25, 12, 30);
System.out.println(v);
System.out.println("空參構造方法");
Constructor constructor1 = cls.getConstructor();
Object o = constructor1.newInstance();
System.out.println(o);
Object o1 = cls.newInstance();
System.out.println(o1);
}
}
3.0 獲取成員方法

import Demo.Person;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
public class Main{
public static void main(String[] args) throws Exception {
Class cls = Person.class;
Method[] methods = cls.getMethods();//person類繼承了object類
for (Method method : methods) {
System.out.println(method);
System.out.println(method.getName());
}
Method method = cls.getMethod("eat");
Person person=new Person();
method.invoke(person);
Method method1 = cls.getMethod("eat",String.class);
Person p=new Person();
method1.invoke(p,"披薩");
}
}
public java.lang.String Demo.Person.toString() toString public java.lang.String Demo.Person.getName() getName public void Demo.Person.setName(java.lang.String) setName public int Demo.Person.getAge() getAge public void Demo.Person.eat() eat public void Demo.Person.eat(java.lang.String) eat public void Demo.Person.setAge(int) setAge public void Demo.Person.setA(int) setA public int Demo.Person.getB() getB public int Demo.Person.getA() getA public void Demo.Person.setB(int) setB public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException wait public final void java.lang.Object.wait() throws java.lang.InterruptedException wait public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException wait public boolean java.lang.Object.equals(java.lang.Object) equals public native int java.lang.Object.hashCode() hashCode public final native java.lang.Class java.lang.Object.getClass() getClass public final native void java.lang.Object.notify() notify public final native void java.lang.Object.notifyAll() notifyAll 吃什么好呢? 那就吃披薩好了
案例

組態檔:Demo01/src/pro.Properties
classname=Demo.Person methodname=eat
package Demo;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.util.Properties;
public class TestPractice {
public static void main(String[] args) throws Exception{
Properties pro=new Properties();
//類加載器 獲取class目錄下的檔案
ClassLoader classLoader=TestPractice.class.getClassLoader();
InputStream stream = classLoader.getResourceAsStream("pro.Properties");
pro.load(stream);
String classname = pro.getProperty("classname");
String methodname = pro.getProperty("methodname");
Class cls = Class.forName(classname);
Object o = cls.newInstance();//空參構造方法
Method method = cls.getMethod(methodname);//方法引數
method.invoke(o);
}
}
列印結果:
吃什么好呢?
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/151066.html
標籤:Java
