欢迎光临散文网 会员登陆 & 注册

Java反射,调用方法,配置文件,打印属性,参数个数,类型名,构造方法【诗书画唱】

2020-08-28 08:22 作者:诗书画唱  | 我要投稿


1、创建一个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");

//通过反射创建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、创建一个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、创建一个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、创建一个properties文件,包含下面的数据:

cls=net.sf.Person

method=study

运行程序后直接执行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;

// ————

//方法二:创建一个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();

}

}


}



Java反射,调用方法,配置文件,打印属性,参数个数,类型名,构造方法【诗书画唱】的评论 (共 条)

分享到微博请遵守国家法律