zoukankan      html  css  js  c++  java
  • java 反射reflect

    面向对象的编程思想

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

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

    类是用来描述一组对象

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

    可以与之前学习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("属性名");公有的,自己类+父类

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

      9.Field=getDeclaredField("属性");自己类(公有+私有)

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

      10.Class[] =getClasses();//获取类中的内部类(public)

    三.Field类中的常用方法

      int i=f.getModifers();//获取属性修饰符(权限+特征)

      Class ni=f.getType();//获取属性的类型

      String nn=f.getName();//获取属性的名字 

       操作属性  往里面存/取值;如果是私有属性不能直接操作的

        setAccessable(true);//设置一个使用权 准入

      set(对象,值) ;给属性赋值

      Object=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
    	}
    }
    

      

     

     

     

     

     

      

      

    越努力,越幸运!!! good good study,day day up!!!
  • 相关阅读:
    函数三
    函数二
    函数一
    python数据类型和编码补充
    Python基础数据类型考试题
    VS2017设置C++标准
    std::weak_ptr
    Visual Assist 配色
    JMeter
    fcgi返回状态码
  • 原文地址:https://www.cnblogs.com/canglongdao/p/13054061.html
Copyright © 2011-2022 走看看