码迷,mamicode.com
首页 > 编程语言 > 详细

java 反射reflect

时间:2020-06-06 12:37:14      阅读:53      评论:0      收藏:0      [点我收藏+]

标签:extend   import   rgs   类型   string   list   class   null   ide   

面向对象的编程思想

类  从很多对象中抽取处理的公用的特征行为  抽象描述  用来描述一组对象;

对象  现实生活中 先存在了好多对象  很多相同特征  相同行为

类是用来描述一组对象

反射机制认为是用来描述一组类

可以与之前学习File对比着学习

Class类     用来描述类本身

Package    用来描述类所属的包

Field       用来描述类中的属性

Method     用来描述类中的方法

Constructor   用来描述类中的构造方法

Annotation    用来描述类中的注解@Override  注解可以放置在(类上面  属性上面 方法上面 构造方法前 参数前 )

技术图片

 

 

 

一.如何获取Class?

  方式1:Class a=Class.forName("包名.类名");

  方式2:Class a=类名.class;

  方式3:通过对象的引用  Class a=对象.getClass();//Object类中的方法

二.Class中的常用方法

  1.int n=a.getModifiers();获取类的修饰符(权限 特征)

  2.String aa=a.getName();获取名字

  3.String ab=a.getSimpleName();简单名

  4.Package p=a.getPackage();

    p.getName();//获去包名

  5.Class m=a.getSuperClass();//获取超类(父类); 

  6.Class[] mm=a.getInterfaces();//获取类的父接口;

  7.Object i=a.newInstance();//默认调用无参数的构造方法创建对象;

  8.Field f=a.getField("属性名");

  9.getDeclaredField("属性");

   Field[] fs=getDeclaredFields();//可以获取公有和私有的属性 只能获取本类中的属性

三.Field类中的常用方法

  int i=f.getModifers();

  Class ni=f.getType();

  String nn=f.getName();

  Field f=f.getField("属性名");

  Field[] fs=f.getFields();//只能获取公有的属性,继承的也算

  

 操作属性  往里面存/取值

  set(对象,值)

  值=get(对象)

技术图片

 

 

package test0606;
public class Animal{
}

 

package test0606;
public class Person extends Animal{
}

 

package test0606;
public class TestMain{
	public static void main(String[] args){
		try{
			//通过一个Class对象来操作Person.class类文件
			Class a=Class.forName("test0606.Person");
			//类自己有结构  权限修饰符  特征修饰符	类名字  继承 实现
			int i=a.getModifiers();//每一个修饰符 用一个整数来进行表示			
			System.out.println(i);
			String name=a.getName();
			String sname=a.getSimpleName();
			System.out.println(name+"---"+sname);
			Package p=a.getPackage();
			System.out.println(p.getName());//获取包名
			Class ax=a.getSuperclass();//获取父类;
			System.out.println("==="+ax.getName());
		}catch(Exception e){
			e.printStackTrace();
		}
	}
}

  技术图片

 

 

 

package test0606;
import java.util.*;
public class TestMain{
	public static void main(String[] args){
		//ArrayList<String> a=new ArrayList<String>();
		Class m=ArrayList.class;
		Class pm=m.getSuperclass();
		while(pm!=null){
			System.out.println(pm.getName());
			pm=pm.getSuperclass();
		}
	}
}

 

package test0606;
import java.util.*;
public class TestMain{
	public static void main(String[] args){
		//ArrayList<String> a=new ArrayList<String>();
		Class m=ArrayList.class;
		Class[] pm=m.getInterfaces();
		for(Class c:pm){
			System.out.println(c.getName());
		}
	}
}

  --------------------------------------------------------------------------------------------

package test0606;
public class Animal{
	public String names;
	private int ages;
}

 

package test0606;
public class Person extends Animal{
	public String name;
	private int age;
	public String toString(){
		return "{name:"+name+","+"age:"+age+"}";
	}
}

  

package test0606;
import java.util.*;
import java.lang.reflect.Field;
public class TestMain{
	public static void main(String[] args){
		try{
			Class a=Class.forName("test0606.Person");
			//Person p=new Person();
			Person p=(Person)a.newInstance();
			Field[] fds=a.getFields();//public的,继承的也算;
			System.out.println(fds.length);
			Field fp=a.getDeclaredField("age");//私有age
			System.out.println("fp:"+fp);
			fp.setAccessible(true);//表示私有属性可以直接被操作;
			fp.set(p,20);
			Integer value=(Integer)fp.get(p);//取值
			System.out.println(value);
			//System.out.println("p:"+p);
			/*
			//通过a获取类中的属性;
			Field n=a.getField("name");//属性名我知道;属性是public
			n.set(p,"画画");
			System.out.println(p);
			String name=(String)n.get(p);
			System.out.println(name);
			*/
			/*
			int num=a.getModifiers();//属性修饰符;
			System.out.println(num);
			Class fc=n.getType();//获取属性的类型 
			System.out.println(fc.getName());
			System.out.println("++"+n.getName());//获取属性名字
			*/
			//System.out.println(
			//Person p=(Person)a.newInstance();//相当于调用Person类的无参数构造方法
			//System.out.println(p);
		}catch(Exception e){
			e.printStackTrace();
		}
		
	}
}

---------------------------------------------------------------------------

 修改字符串的值;

package test0606;
import java.lang.reflect.Field;
public class TestMain{
	public static void main(String[] args) throws Exception{
		String a="abc";
		System.out.println(a);//abc
		//反射的技术可以获取私有属性  可以操作私有属性  
		//1.获取String类对应的那个class
		Class cs=a.getClass();
		Field fd=cs.getDeclaredField("value");//2.获取类中的属性;
		//3.直接操作属性的值不可以  设置私有属性可以被操作
		fd.setAccessible(true);			  
		//获取value属性里面的值(内存地址);
		char[] temp=(char[])fd.get(a);
		//通过temp的地址引用 找到真实String对象中的数组 修改数组中的每一个元素
		temp[0]=‘爱‘;
		temp[1]=‘1‘;
		temp[2]=‘2‘;
		System.out.println(a);//爱12
	}
}

  

 

 

 

 

 

 

  

  

 

java 反射reflect

标签:extend   import   rgs   类型   string   list   class   null   ide   

原文地址:https://www.cnblogs.com/canglongdao/p/13054061.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!