Java反射,調用方法,配置文件,打印屬性,參數個數,類型名,構造方法【詩書畫唱】
1、創(chuàng)建一個Car類,包含車牌和價格兩個屬性,通過反射打印出這個類中的所有屬性(如name)和屬性類型(如java.lang.String等),里面有一個public void run方法,通過反射調用(即為打?。┻@個run方法。


package Car;
public class Car {
? ? private String name;
?
? ? private Double price;
? ? public Car(){
? ?
? ? }
? ?
? ? public void run(){
? ? System.out.println("正在跑");
? ? }
? ?
}


package Car;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class FanShe {
public static void main(String[] args)? ?throws Exception{
System.out.println("__________\n"
+ "獲取Car類對應的Class實例:");
try {
//下面的類型為Class的c就是打開反射世界的鑰匙:
Class c = Class.forName("Car.Car");
//聲明數組,遍歷數組等步驟獲取Car類的所有成員屬性Field(private的也可以獲取到):
Field[]FieldShuZu = c.getDeclaredFields();
for(int i = 0;i < FieldShuZu.length;i ++) {
//拿出每個成員屬性前要聲明i為下標數組的成員(內容等):
Field f = FieldShuZu[i];
//下面是用getName獲取這個成員屬性的名字:
String n = f.getName();
System.out.println("\n名字是:" + n);
//下面是用getType獲取這個成員屬性的類型:
Class t = f.getType();
System.out.println("類型是:" + t.getName());
}
System.out.println("__________\n"
+ "獲取Car類中的構造方法(特征就是沒有void的)"
+ "(用上Constructor):");
//獲取Car類中的構造方法(Constructor)
Constructor[]cs = c.getDeclaredConstructors();
for(int i = 0;i < cs.length;i ++) {
//取出Car類中的每個構造方法:
Constructor con = cs[i];
//獲取構造方法的參數的個數:
int count = con.getParameterCount();
System.out.println("\n其中的一個構造方法的參數的個數是:" + count);
//獲取構造方法的參數的類型(數組),
//類型為Class的數組pt,pt(為getParameterTypes的字母)
Class[]pt = con.getParameterTypes();
for(int j = 0;j < pt.length;j ++) {
//取出當前構造方法中的每個參數
Class t = pt[j];
System.out.println("這個構造方法的參數類型其中一個為:"+t.getName());
}
}
//獲取Car類中的所有的方法(Method)
System.out.println("__________\n"
+ "獲取Car類中的所有的方法(特征就是有void)"
+ "(用上Method):");
Method[]ms = c.getDeclaredMethods();
for(int i = 0;i < ms.length;i ++) {
//取出每個方法
Method m = ms[i];
//取出方法名
String methodName = m.getName();
System.out.println("方法名為:"+methodName);
? ?
}
System.out.println("\n"
+ "下面是調用類中的方法,打印有void的方法中的內容:\n");
//通過反射創(chuàng)建Car對象
Object car = c.newInstance();
//通過反射調用方法
//獲取eat方法對象
Method m1 = c.getDeclaredMethod("run");
//反射調用eat方法,方法.對象
m1.invoke(car) ;
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}


2、創(chuàng)建一個Cat類,里面有一個public void cry方法,通過反射調用cry方法。


package fanShe;
import java.util.Date;
public class Cat {
? ? private String name;
? ? private Integer age;
? ?
? ? public Cat(){
? ?
? ? }
? ??
? ? public Cat(String n,Integer a){
? ? this.name = n;
? ? this.age = a;
? ?
? ? }
? ??
? ? public void cry(){
? ? System.out.println("正在叫");
? ? }
? ?
}


package fanShe;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class FanShe {
public static void main(String[] args)? ?throws Exception{
try {
Class c = Class.forName("fanShe.Cat");
System.out.println("\n"
+ "下面是調用類中的方法,打印有void的方法中的內容:\n");
Object Cat = c.newInstance();
Method M = c.getDeclaredMethod("cry");
M.invoke(Cat) ;
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}


3、創(chuàng)建一個Apple類,包含顏色和價格以及類型三個屬性,通過反射打印出所有屬性和屬性類型,里面有一個public void grow方法,通過反射調用grow方法。


package fanShe;
import java.util.Date;
public class Apple {
public String color;
? ? private String type;
? ?
? ? private Double price;
? ?
? ? public Apple(){
? ?
? ? }
? ?
? ? public Apple(String type,Double price){
? ? this.type = type;
? ?
? ? this.price = price;
? ?
? ? }
? ??
? ? public void grow(){
? ? System.out.println("詩書畫唱獨到的種蘋果的方法");
? ? }
? ?
}


package fanShe;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class AppleFanShe {
public static void main(String[] args)? ?throws Exception{
try {
Class c = Class.forName("fanShe.Apple");
Field[]FieldShuZu = c.getDeclaredFields();
for(int i = 0;i < FieldShuZu.length;i ++) {
Field f = FieldShuZu[i];
String shuXing = f.getName();
System.out.println("\n屬性的名字是:" + shuXing);
Class type = f.getType();
System.out.println("屬性的類型是:" + type.getName());
}
System.out.println("\n"
+ "下面是調用類中的方法,打印有void的方法中的內容:\n");
Object Apple = c.newInstance();
Method fangFa = c.getDeclaredMethod("grow");
fangFa.invoke(Apple) ;
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}



4、在控制臺接收一個字符串,這個字符串是一個類的全路徑名,再接收一個方法名,通過反射調用這個類中的這個方法。
效果如下:
請輸入類的全路徑:
net.sf.Person
請輸入方法名:
study
好好學習


package net.sf;
import java.util.Date;
public class Person {
public String name;
? ? private String sshc;
? ?
? ?
? ?
? ? public Person(){
? ?
? ? }
? ?
? ??
? ??
? ? public void study(){
? ? System.out.println("好好學習");
? ? }
? ?
}

package net.sf;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Scanner;
public class PfanShe {
public static void main(String[] args)? ?throws Exception{
try {
Scanner Sca = new Scanner(System.in);
? ? ? ?
? ? ? ? System.out.println("請輸入類的全路徑:");
? ? ? ? String Src = Sca.next();
Class c = Class.forName(Src);
System.out.println("請輸入方法名:");
String FangFaName = Sca.next();
System.out.println("\n"
+ "下面是調用類中的方法,打印有void的方法中的內容:\n");
Object Person = c.newInstance();
Method fangFa = c.getDeclaredMethod(FangFaName);
fangFa.invoke(Person) ;
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}


5、創(chuàng)建一個properties文件,包含下面的數據:
cls=net.sf.Person
method=study
運行程序后直接執(zhí)行Person類中的study方法。


package net.sf;
import java.util.Date;
public class Person {
public String name;
? ? private String sshc;
? ?
? ?
? ?
? ? public Person(){
? ?
? ? }
? ?
? ??
? ??
? ? public void study(){
? ? System.out.println("好好學習");
? ? }
? ?
}


package net.sf;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Properties;
import java.util.Scanner;
public class PfanShe {
// private static String Src = null;
// private static String FangFaName = null;
public static void main(String[] args)? ?throws Exception{
Properties prop = new Properties();
? ? //將db.properties文件讀取到內存中去:
? ? InputStream is = PfanShe.class.getClassLoader()
? ? .getResourceAsStream("db.properties");
? ? //加載內容:
? ?
prop.load(is);
//讀取內容:
String Src = prop.getProperty("cls");
String FangFaName = prop.getProperty("method");
// System.out.println(Src+FangFaName);?
// Scanner Sca = new Scanner(System.in);
//? ? ? ?
//? ? ? ? System.out.println("請輸入類的全路徑:");
//? ? ? ? String Src = Sca.next();
Class c = Class.forName(Src);
//System.out.println("請輸入方法名:");
//
//String FangFaName = Sca.next();
// System.out.println("\n"
//+ "下面是調用類中的方法,打印有void的方法中的內容:\n");
Object Person = c.newInstance();
Method fangFa = c.getDeclaredMethod(FangFaName);
fangFa.invoke(Person) ;
}
}


原型例子:
(自己出和寫的題目:)
用反射打印出聲明的類屬性名和屬性的類型名(類可以先寫在同一個界面,也可以分開寫等):

package fanShe;
import java.sql.*;
import java.lang.reflect.Field;
public class Text {
public static void main(String[] args) {
? ? ? ? ? ? try{
? ? ? ? ? ? Class c=Class.forName("fanShe.Student");
? ? ? ? ? ? Field[]fs=c.getDeclaredFields();
? ? ? ? ? ? for(int i=0;i<fs.length;i++){
? ? ? ? ? ? Field f=fs[i];
? ? ? ? ? ? String n=f.getName();
? ? ? ? ? ? System.out.println("\n名字是:"+n);
? ? ? ? ? ? Class t=f.getType();
? ? ? ? ? ? System.out.println("類型是:"+t.getName());
? ? ? ? ? ? }
? ? ? ? ? ? }catch(ClassNotFoundException e){
? ? ? ? ? ?
? ? ? ? ? ? }
}
}
?class Student {
? ? ? ? ? ? ? public Integer id;
? ? ? ? ? ? ? public String? name;
? ? ? ? ? ? ? public Date birth;
? ? ? ? ? ? ? public Cat pet;
}
class Cat{
}


用反射的知識打印出自己聲明為包裝類等類型的變量名(就是屬性名),
和相關的屬性類型的名稱,構造方法名和構造方法的參數和參數類型,參數的個數,方法名等。

package com.sshc;
import java.util.Date;
public class Cat {
public String sshc;
? ? private String name;
? ? private Integer age;
? ? private Double price;
? ? private Date birth;
? ? public Cat(){
? ?
? ? }
? ? public Cat(String n) {
? ? this.name = n;
? ? }
? ? public Cat(String n,Integer a,Double p,Date b){
? ? this.name = n;
? ? this.age = a;
? ? this.price = p;
? ? this.birth = b;
? ? }
? ??
? ? public void eat(){
? ? System.out.println("正在吃東西");
? ? }
? ? public void play(){
? ? System.out.println("正在玩耍");
? ? }
}


package sshc;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class Test {
public static void main(String[] args) {
// ————
? ? ? ? //下面Date的Class實例(共三種獲得Date的內容的方法):
// ————
//方法一:直接通過類名.class
// Class c1 = Date.class;
// ————
//方法二:創(chuàng)建一個Date對象,然后通過對象.getClass()方法
//Date now = new Date();
//Class c2 = now.getClass();
//類的全路徑:包名+.+類名
// ————
//方法三:Class.forName(類的全路徑)
// try {
// //使用反射技術的核心代碼
// Class c3 = Class.forName("java.util.Date");
// } catch (ClassNotFoundException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
// ————
//下面是獲取Cat類對應的Class實例:
System.out.println("__________\n"
+ "獲取Cat類對應的Class實例:");
try {
//下面的類型為Class的c就是打開反射世界的鑰匙:
Class c = Class.forName("com.sshc.Cat");
//聲明數組,遍歷數組等步驟獲取Cat類的所有成員屬性Field(private的也可以獲取到):
Field[]FieldShuZu = c.getDeclaredFields();
for(int i = 0;i < FieldShuZu.length;i ++) {
//拿出每個成員屬性前要聲明i為下標數組的成員(內容等):
Field f = FieldShuZu[i];
//下面是用getName獲取這個成員屬性的名字:
String n = f.getName();
System.out.println("\n名字是:" + n);
//下面是用getType獲取這個成員屬性的類型:
Class t = f.getType();
System.out.println("類型是:" + t.getName());
}
System.out.println("__________\n"
+ "獲取Cat類中的構造方法(特征就是沒有void的)"
+ "(用上Constructor):");
//獲取Cat類中的構造方法(Constructor)
Constructor[]cs = c.getDeclaredConstructors();
for(int i = 0;i < cs.length;i ++) {
//取出Cat類中的每個構造方法:
Constructor con = cs[i];
//獲取構造方法的參數的個數:
int count = con.getParameterCount();
System.out.println("\n其中的一個構造方法的參數的個數是:" + count);
//獲取構造方法的參數的類型(數組),
//類型為Class的數組pt,pt(為getParameterTypes的字母)
Class[]pt = con.getParameterTypes();
for(int j = 0;j < pt.length;j ++) {
//取出當前構造方法中的每個參數
Class t = pt[j];
System.out.println("這個構造方法的參數類型其中一個為:"+t.getName());
}
}
//獲取Cat類中的所有的方法(Method)
System.out.println("__________\n"
+ "獲取Cat類中的所有的方法(特征就是有void)"
+ "(用上Method):");
Method[]ms = c.getDeclaredMethods();
for(int i = 0;i < ms.length;i ++) {
//取出每個方法
Method m = ms[i];
//取出方法名
String methodName = m.getName();
System.out.println("方法名為:"+methodName);
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}






