反射基本语法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/myloveprogrmming/article/details/82871129
package reflect;
import java.io.*;
import java.lang.reflect.*;
import java.util.*;

class Teacher{
	@Override
	public String toString() {
		return "Teacher [name=" + name + ", age=" + age + ",sex="+sex+"]";
	}
	public String name;
	protected int age;
	private static char sex;
	
	public Teacher()
	{
		System.out.println("无参构造方法");
	}
	protected  Teacher(String name)
	{
		this.name=name;
		System.out.println(name);
	}
	Teacher(String name,int age) 
	{
		this.name=name;
		this.age=age;
		System.out.println(name+"--"+age);
	}
	private Teacher(String name,int age,char sex) 
	{
		this.name=name;
		this.age=age;
		this.sex=sex;
		System.out.println(name+"--"+age+"--"+sex);
	}
	public void publicf() {
		System.out.println("我是public方法");
	}
	protected void protectedf(int value) {
		System.out.println("我是protected的方法,我里面有一个int参数值为"+value);
	}
	void defaultf(String s) {
		System.out.println("我是默认方法,我里面有一个String参数值为"+s);
	}
	private void privatef(String s,int value) {
		System.out.println("我是private方法,我里面有(String,double)参数值为"+s+" "+value);
	}
	public static void staticf(Integer value) {
		System.out.println("我是静态方法,我里面有一个Integer参数值为"+value);
	}

}
public class ReflectTest1 {
	//把字符串形式的键值对存到.properties文件中(输出流)
	public static void saveProperties(String toPath) throws IOException{
		FileOutputStream fos=new FileOutputStream(new File(toPath));
		Properties pro=new Properties();
		pro.setProperty("name", "ChenLong");
		pro.setProperty("age", "36");
		pro.setProperty("sex", "男");
		pro.store(fos, "I miss u my Long");
		fos.close();
	}
	
	//从.propertis文件中读取内容(输入流),给定键得到值(都是字符串形式)
	public static void readProperties(String fromPath) throws IOException {
		FileInputStream fis=new FileInputStream(new File(fromPath));
		Properties pro=new Properties();
		pro.load(fis);
		System.out.println(pro.getProperty("name"));
		System.out.println(pro.getProperty("age"));
		System.out.println(pro.getProperty("sex"));
		fis.close();
		
	}
	public static void main(String[] args) throws Exception{
		System.out.println("-------------测试读写配置文件-------------");
		saveProperties("d:\\xxx.properties");
		readProperties("d:\\xxx.properties");
		
		System.out.println("-------------测试调用构造方法-------------");
		System.out.println("---遍历所有的属性(包括私有的)----");
		Class cls=Class.forName("reflect.Teacher");//得到Class类型的对象,即类的类型的对象
		Constructor[] constructor=cls.getDeclaredConstructors();//返回Constructor类型的数组,存的是所有的构造方法(包括私有的)
		for(Constructor con:constructor) {
			System.out.println(con);
		}
		System.out.println("----调用public构造方法----");
		Constructor con1=cls.getDeclaredConstructor();
		Teacher t1=(Teacher)con1.newInstance();//调用默认构造方法创建对象
		System.out.println("----调用protected构造方法----");
		Constructor con2=cls.getDeclaredConstructor(String.class);
		Teacher t2=(Teacher)con2.newInstance("陈龙");
		System.out.println("----调用默认构造方法---");
		Constructor con3=cls.getDeclaredConstructor(String.class,int.class);
		Teacher t3=(Teacher)con3.newInstance("陈龙龙",22);
		System.out.println("----调用默private构造方法---");
		Constructor con4=cls.getDeclaredConstructor(String.class,int.class,char.class);
		con4.setAccessible(true);//暴力访问
		Teacher t4=(Teacher)con4.newInstance("龙哥",35,'m');
		System.out.println("----------------测试调用属性--------------");
		System.out.println("---遍历所有的构造方法(包括私有的)----");
		Field[] fields=cls.getDeclaredFields();//返回所有的属性,包括私有的属性
		for(Field f:fields)
		{
			System.out.println(f);
		}
		System.out.println("---遍历所有的public属性----");
		Field[] fields1=cls.getFields();
		for(Field f:fields1) { 
			System.out.println(f);
		}
		System.out.println("-----创建一个对象(系统自动调用默认构造方法)-----");
		Teacher teacher=(Teacher)cls.newInstance();
		System.out.println("----为teacher对象设置public属性的值并获取其值----");
		Field fname=cls.getDeclaredField("name");
		fname.set(teacher,"大岛君");//设置teacher对象的name属性为"大岛君"
		System.out.println(fname.get(teacher));//得到teacher对象fname属性的值
		System.out.println("----为teacher对象设置protected属性的值并获取其值----");
		Field fage=cls.getDeclaredField("age");
		fage.setInt(teacher, 22);
		System.out.println(fage.getInt(teacher));
		System.out.println("----为teacher对象设置static private属性的值并获取其值----");
		Field fsex=cls.getDeclaredField("sex");
		fsex.setAccessible(true);//因为是私有的所以要暴力访问
		fsex.setChar(null, 'm');//因为是静态的,所以不用指定对象,当然这里把null换成teacher也是对的
		System.out.println(fsex.getChar(teacher));
		System.out.println("遍历teacher对象的属性值");
		System.out.println(teacher);
		System.out.println("-------------测试调用普通方法-------------");
		System.out.println("---遍历所有的public普通方法(妈的这里面乱七八糟的啥都有并不是只有你写的方法,不适用)----");
		Method[] methods1=cls.getMethods();
		for(Method m:methods1) {
			System.out.println(m);
		}
		System.out.println("----遍历所有的普通方法(只有你自己写的方法)----");
		Method[] methods2=cls.getDeclaredMethods();
		for(Method m:methods2) {
			System.out.println(m);
		}
		System.out.println("---调用public方法publicf()----");
		Method mpublic=cls.getDeclaredMethod("publicf");//第一个参数为函数名,后面的参数是参数1.class,参数2.class,这里没有参数不用写
		mpublic.invoke(teacher);//invoke:调用
		System.out.println("---调用protected方法protectedf(int)----");
		Method mprotected=cls.getDeclaredMethod("protectedf",int.class);//第一个参数为函数名,后面的参数是参数1.class,参数2.class
		mprotected.invoke(teacher,1);//第一个参数为对象名,后面的参数是参数表的实参
		System.out.println("---调用默认方法defaultf(String)----");
		Method mdefault=cls.getDeclaredMethod("defaultf", String.class);
		mdefault.invoke(teacher,"卡卡西" );
		System.out.println("---调用private方法privatef(String,int)----");
		Method mprivate=cls.getDeclaredMethod("privatef", String.class,int.class);
		mprivate.setAccessible(true);
		mprivate.invoke(teacher,"漩涡鸣人",22);
		System.out.println("---调用public static方法staticf(Integer)----");
		Method mstatic=cls.getDeclaredMethod("staticf", Integer.class);
		mstatic.invoke(null, new Integer(100));//静态方法第一个参数可以写null,静态不需要创建对象再调用,但是写对象也是对的
		
		
		
		
	}

}

输出:
 

-------------测试读写配置文件-------------
ChenLong
36
男
-------------测试调用构造方法-------------
---遍历所有的属性(包括私有的)----
private reflect.Teacher(java.lang.String,int,char)
protected reflect.Teacher(java.lang.String)
public reflect.Teacher()
reflect.Teacher(java.lang.String,int)
----调用public构造方法----
无参构造方法
----调用protected构造方法----
陈龙
----调用默认构造方法---
陈龙龙--22
----调用默private构造方法---
龙哥--35--m
----------------测试调用属性--------------
---遍历所有的构造方法(包括私有的)----
public java.lang.String reflect.Teacher.name
protected int reflect.Teacher.age
private static char reflect.Teacher.sex
---遍历所有的public属性----
public java.lang.String reflect.Teacher.name
-----创建一个对象(系统自动调用默认构造方法)-----
无参构造方法
----为teacher对象设置public属性的值并获取其值----
大岛君
----为teacher对象设置protected属性的值并获取其值----
22
----为teacher对象设置static private属性的值并获取其值----
m
遍历teacher对象的属性值
Teacher [name=大岛君, age=22,sex=m]
-------------测试调用普通方法-------------
---遍历所有的public普通方法(妈的这里面乱七八糟的啥都有并不是只有你写的方法,不适用)----
public java.lang.String reflect.Teacher.toString()
public void reflect.Teacher.publicf()
public static void reflect.Teacher.staticf(java.lang.Integer)
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
----遍历所有的普通方法(只有你自己写的方法)----
public java.lang.String reflect.Teacher.toString()
public void reflect.Teacher.publicf()
void reflect.Teacher.defaultf(java.lang.String)
protected void reflect.Teacher.protectedf(int)
private void reflect.Teacher.privatef(java.lang.String,int)
public static void reflect.Teacher.staticf(java.lang.Integer)
---调用public方法publicf()----
我是public方法
---调用protected方法protectedf(int)----
我是protected的方法,我里面有一个int参数值为1
---调用默认方法defaultf(String)----
我是默认方法,我里面有一个String参数值为卡卡西
---调用private方法privatef(String,int)----
我是private方法,我里面有(String,double)参数值为漩涡鸣人 22
---调用public static方法staticf(Integer)----
我是静态方法,我里面有一个Integer参数值为100

猜你喜欢

转载自blog.csdn.net/myloveprogrmming/article/details/82871129