精华内容
下载资源
问答
  • /** * @author 万星明 * @version 创建时间:...public class 反射调用对象方法 { public static void main(String[] args) throws Exception { //创建反射对象 Class<?> clazz = Class.fo...
    /** 
    * @author  万星明
    * @version 创建时间:2018年10月26日 下午12:01:36 
    * 类说明 
    */
    public class 反射调用对象方法 {
    	public static void main(String[] args) throws Exception {
    		
    		//创建反射对象
    		Class<?> clazz = Class.forName("反射与URL.Student");
    		//通过反射对象创建实例对象
    		Object ob1 = clazz.newInstance();
    	
    		//通过反射对象获得方法
    		Method show=clazz.getDeclaredMethod("show2",String.class,Integer.class);
    		//设置方法的访问权限
    		show.setAccessible(true);
    		System.out.println("方法的访问修饰符:"+show.getModifiers());
    		System.out.println("方法的返回值:"+show.getReturnType());
    		//调用方法
    		show.invoke(ob1,"万星明",23);
    		
    	}
    }
    
    展开全文
  • Java试题-5:应用反射创建对象,调用对象方法 反射为Java的高级技术应用
  • 该篇文章主要介绍当我们碰到参数或者返回值是一个对象时,如何通过frida反射调用对象方法(methods)与获取该对象的字段(fields)。感兴趣的朋友可以下载下来看看,了解了解
  • 主要介绍了Java使用反射调用方法,结合实例形式分析了java使用反射调用对象方法的相关操作技巧,需要的朋友可以参考下
  • java基础-反射3(反射反射创建对象,操作对象属性,调用对象方法)前面通过学习,我们了解的运行时类型信息的基本原理,以及通过Class对象和反射来获取运行时类型信息。下面来了解通过反射来创建对象,以及操作...

    java基础-反射3(反射,反射创建对象,操作对象属性,调用对象方法)

    前面通过学习,我们了解的运行时类型信息的基本原理,以及通过Class对象和反射来获取运行时类型信息。下面来了解通过反射来创建对象,以及操作对象的属性和方法

    首先还是创建一个person类

    
    @Service
    public class Person1 extends PersronParent implements PersonInterfance ,Cloneable{
        public  String name;
        public  double weight;
        protected  double height;
        private Integer age;
    
        public Person1(){}
    
        protected Person1(String name){
        }
        public void publicShow() throws Exception{
            System.out.println("publicShow()");
        }
        protected void disPlay(){
            System.out.println("disPlay()");
    
        }
    
        private String privateShow(String paramter1,String paramter2) throws NullPointerException{
            StringBuffer stringBuffer  = new StringBuffer(paramter1);
            return stringBuffer.append(paramter2).toString();
        }
        @Deprecated
        private int testParamter(String paramter1,String paramter2) throws NullPointerException{
            return 1;
        }
    
        @Deprecated
        public int testPublicParamter(String paramter1,String paramter2) throws NullPointerException{
            return 1;
        }
    
        @Override
        public void parentSay(){
            super.parentSay();
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public double getWeight() {
            return weight;
        }
    
        public void setWeight(double weight) {
            this.weight = weight;
        }
    
        public double getHeight() {
            return height;
        }
    
        public void setHeight(double height) {
            this.height = height;
        }
    
        public Integer getAge() {
            return age;
        }
    
        public void setAge(Integer age) {
            this.age = age;
        }
    
        @Override
        public String toString() {
            return "Person{" +
                    "name='" + name + '\'' +
                    ", weight=" + weight +
                    ", height=" + height +
                    ", age=" + age +
                    '}';
        }

    通过反射来创建对象

    通常在java中我们有以下4中方式创建对象

    1. 通过new 关键字 创建对象
    2. 通过Object clone();方法
    3. 通过反序列化
    4. 通过反射创建

    这里我们来了解通过反射来创建对象和调用方法

    首先我们来看通过反射来创建对象
    我们通过newInstance()来创建对象,如果对于无参数的构造方法我们直接用Class的对象的newInstance()就可以创建对象
    如果对于有参数的构造方法,我们需要先获取带参数的构造器(注意权限修饰符),然后通过构造器的newInstance()方法创建对象。

    public class TestReflect {
    
        public static void main(String[] agrs){
    
                Class<Person> personClass = Person.class;
                try {
                    /**
                     * 通过无参数的构造方法创建对象
                     */
                    Person personOne =   personClass.newInstance();
                    /**
                     * 通过有参数的构造方法创建对象
                     */
                    Constructor constructor = personClass.getDeclaredConstructor(String.class);
                    Person personTwo =   (Person) constructor.newInstance("带参数");
    
                } catch (InstantiationException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                } catch (NoSuchMethodException e) {
                    e.printStackTrace();
                } catch (InvocationTargetException e) {
                    e.printStackTrace();
                }
    
        }
    
    }
    

    运行结果如下
    这里写图片描述

    这样我们就可以通过反射来创建对象。
    通过反射创建对象后可以通过反射来给操作对象的属性

    通过反射操作对象属性

    上一篇文章说过,类的属性在反射中使用java.lang.reflect.Field表示,当然也使用这个类来操作对象的属性,在java中属性的访问涉及到权限修饰的修饰,具体如下:
    这里写图片描述

    所以在操作对象的属性的需要注意对目标类属性访问的权限,如下
    如果当前类对目标对象有访问的权限(如目标类属性为public)

    1. 通过Class对象的getField()获取Field。
    2. 然后通过Field的set()方法对目标对象赋值。

    如果当前类对目标对象没有访问的权限(如目标类属性为private)

    1. 通过Class对象的getDeclaredField()获取Field。
    2. 调用Field 的setAccessible(true)方法,设置为可访问(如果不设置为true,则在当前类中不能访问目标类的属性,在为目标对象赋值时会报错)
    3. 然后通过Field的set()方法对目标对象赋值。
    4. 调用Field 的setAccessible(false)方法复原。

    具体操作如下

    public class TestFileId2 {
        public static void main(String agrs[]) throws NoSuchFieldException {
            try {
                //获取Class 对象
                Class<Person> personClass  = Person.class;
                //创建目标对象(注意,我们这里直接用的object,更体现了运行时类型信息)
                Object person = personClass.newInstance();
                //在没有通过反射赋值之前
                System.out.println("person对象在没有赋值之前");
                System.out.println(person.toString());
                System.out.println();
    
                System.out.println("当前类可以操作目标类的属性:比如public权限的属性");
                //获取有权限操作的属性(当前类可以操作目标对象的属性:比如public)
                Field name = personClass.getField("name");
                //为person 对象 的 name属性赋值为 TestName
                name.set(person,"TestName");
                System.out.println(person.toString());
                System.out.println();
    
                System.out.println("当前类不能够操作目标类的属性:比如private权限的属性");
                Field age = personClass.getDeclaredField("age");
                //为person 对象 的 age 属性设置为可访问
                age.setAccessible(true);
                //为person 对象 的 age属性赋值为 10
                age.set(person,10);
                age.setAccessible(false);
                System.out.println(person.toString());
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
    }

    运行结果如下
    这里写图片描述

    通过反射调用对象方法

    反射能够操作对象的属性,当然也可以操作对象的方法,方法通过java.lang.reflect.Method表示,由于访问权限的限制,对于方法也有如下操作
    如果当前类对目标对象有访问的权限(如目标类方法为public)

    1. 通过Class对象的getMethod()获取Method。
    2. 然后通过Method的invoke()方法对目标对象赋值。

    如果当前类对目标对象没有访问的权限(如目标类方法为private)

    1. 通过Class对象的getDeclaredMethod()获取Method。
    2. 调用Method的setAccessible(true)方法,设置为可访问(如果不设置为true,则在当前类中不能访问目标类的方法,在调用目标类的方法时会报错)
    3. 然后通过Method的invoke()方法对目标对象赋值。
    4. 调用Method的setAccessible(false)方法复原。

    具体操作如下:

    public class TestMethod2 {
        public static void main(String agrs[]) throws NoSuchFieldException, NoSuchMethodException, InvocationTargetException {
            try {
                //获取Class 对象
                Class<Person> personClass = Person.class;
                //创建目标对象
                Object person = null;
                person = personClass.newInstance();
    
                System.out.println("当前类可以操作目标类的方法:比如public权限的方法");
                //获取有权限操作的方法(当前类可以操作目标对象的方法:比如public)
                Method publicShow = personClass.getMethod("publicShow");
                //通过Method 的invoke 调用person 的 publicShow方法
                publicShow.invoke(person);
    
    
                System.out.println("当前类不能够操作目标类的方法:比如private权限的方法");
                Method privateShow = personClass.getDeclaredMethod("privateShow", String.class, String.class);
                //为person 对象 的 privateShow 方法设置为可访问
                privateShow.setAccessible(true);
                //通过Method 的invoke 调用person 的 privateShow方法
                String result = (String) privateShow.invoke(person, "参数1", "参数2");
                System.out.println(result);
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
    
    }
    

    运行结果如下:
    这里写图片描述

    以上就是通过反射操作对象的基本方式。

    反射的基础知识就是以上几篇文章,反射相对于其他知识来说比较简单,但是反射应用很多,比如很多框架,以及java中的动态代理等都涉及到了,所以反射在java中还是很重要的。

    展开全文
  • 分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!... 请看下面的代码: import java.lang.reflect.Method;... public static void main(String[] args) throws E...

    分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请点击http://www.captainbed.net 

    请看下面的代码:

    import java.lang.reflect.Method;
     
    class MethodInvokeTest {
     
        public static void main(String[] args) throws Exception {
            String str = "hello";
            Method m = str.getClass().getMethod("toUpperCase");
            System.out.println(m.invoke(str));  // HELLO
        }
    }

     

    展开全文
  • 一.Java反射拿到调用对象方法 1.通过Class.forName(“包名+方法的类名”)拿到方法的对象; 如:Class&lt;?&gt; clazz = Class.forName("ReflectionTest");  也可以通过实例,获取方法的对象...

     

    一.Java反射拿到调用对象的方法

    1.通过Class.forName(“包名+方法的类名”)拿到方法的对象;

    如:Class<?> clazz = Class.forName("ReflectionTest");

            也可以通过实例,获取方法的对象类,

            如:String str = "test , reflection";

            Class<?> clazz = str.getClass();

    2.明确反射方法名称 ;

    3.明确方法的参数类型,就可以拿到对象的方法。

    如:Method method = clazz.getMethod("test",String.class,int.class);

     

     

     二.接着就是invoke()调用方法了:

    1.实例化对象,可以直接调用已创建的对象,也可以newInstance()一个。

    2.确定具体方法的参数

    如:     Object obj1 = method.invoke(clazz.newInstance(),"xiaojun",23);

           System.out.println("直接反射:"+obj1);

     

     

    三.补充一些关于Java反射的知识:

    Java反射的作用:在Java代码编译时,可以通过反射访问装载到JVM中类的内部信息。

    如: Clazz.getName()获取类的完整名字

                      getPackage()获取此类所属的包

                      getSuperclass() 获取父类对应的Class对象

                       getFiled(String name) 获得类的指定成员变量

                       getMethods() 获得类的public类型的方法

                       getMethod(String name, Class[] args) 获取类的指定方法

     

    四.具体实例:

    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    
    public class ReflectionTest {
    	
    	public String test(String name ,int age) {
    		
    		return name+",今年"+age+"岁,是一个极富好奇心地乐观青年!";
    	}
    	
    	public static void main(String args[]) {
    		
    			String str = "test , reflection";
    			int len1 = str.length();
    			System.out.println("直接调用length() :"+len1);
    			
    			//反射String.length()方法
    			//直接填入调用该方法的对象str,这里不需要newInstance()
    			Object len2 = Reflection(str,str.getClass(),"length",null,null);
    			System.out.println("java 反射调用length() :"+len2);
    	
    			Class<?> clazz;
    		
    				try {
    					
    					//调用自己创建的函数,
    					//反射得到类 包名+类名,我这边没有包名就直接是 "ReflectionTest"
    					clazz = Class.forName("ReflectionTest");
    					
    					//直接java反射得到方法
    					Method method= clazz.getMethod("test",String.class,int.class);
    					Object obj1 = method.invoke(clazz.newInstance(),"xiaojun",23);
    					System.out.println("直接反射:"+obj1);
    					
    					
    					//创建函数完成反射
    				  //创建参数class 类型的数组
    					Class<?> cla[] = {String.class,int.class};
    					Object obj = Reflection(clazz.newInstance(),clazz,"test",cla,"小君",22);
    					System.out.println("创建函数完成反射: "+obj);
    					
    				
    				} catch (ClassNotFoundException e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				} catch (InstantiationException e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				} catch (IllegalAccessException e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				} catch (NoSuchMethodException e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				} catch (SecurityException e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				} catch (IllegalArgumentException e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				} catch (InvocationTargetException e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				}
    
    	}
    	
    	/*
    	 * 通过反射执行cclass的方法
    	 * @param   object  ---调到该方法的具体对象
    	 * @param   cclass  ---具体对象的class类型
    	 * @param   paramClasses ---反射方法中参数class类型
    	 * @param   methodName   ---反射方法的名称
    	 * @param   args    ----调用该方法用到的具体参数
    	 * 
    	 * 
    	 * */
    	public static Object Reflection(Object object ,Class<?> cclass,String methodName,Class<?>[] paramclasses, Object... args) {
    		
    		try {
    			
    			Method method = cclass.getMethod(methodName,paramclasses);
    			return method.invoke(object,args);
    			
    			
    		} catch (NoSuchMethodException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (SecurityException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (IllegalAccessException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (IllegalArgumentException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (InvocationTargetException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		
    		return null;
    		
    	}
    
    }
    
        /* 运行结果:
            直接调用length() :17
            java 反射调用length() :17
            直接反射:xiaojun,今年23岁,是一个极富好奇心地乐观青年!
            创建函数完成反射: 小君,今年22岁,是一个极富好奇心地乐观青年!*/
    
    
    

    运行结果:

    直接调用length() :17
    java 反射调用length() :17
    直接反射:xiaojun,今年23岁,是一个极富好奇心地乐观青年!
    创建函数完成反射: 小君,今年22岁,是一个极富好奇心地乐观青年!

     

    欢迎加入我的Java与Android逆向开发交流QQ群,一起交流学习。

     

    展开全文
  • c# 反射调用对象成员 ! 可对于反射对象的所有成员,进行动态操作 !注释清晰,适合学习......
  • 主要介绍了java通过反射创建对象调用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • 1使用反射调用静态方法:  静态方法不属于任何对象,静态方法属于类本身.  此时把invoke方法的第一个参数设置为null即可. 使用反射调用数组参数(可变参数):  王道:调用方法的时候把实际参数统统作为...
  • //一些变量,好处是可以存储全局变量,与全局运行方法,比如用户认证 } func (self *G) Go(handler interface{}) http .HandlerFunc { **//关键时刻** return func(w http .ResponseWriter , r *http .Request ){ ...
  • Java反射调用静态方法

    千次阅读 2019-04-19 15:10:51
    自己的一个例子讲解一下反射调用静态方法 这里以String.join()方法举例将 String[] arr= {“I”,“came”,“from”,“Laifeng”,“in”,“Hubei”,“Enshi,”, “which”,“is”,“a”,“small”,“developing”,...
  • 反射:使用反射调用方法

    千次阅读 2017-07-03 14:04:20
    1.使用反射调用方法 1):获取方法所在类的字节码对象. 2):获取方法对象. 3):使用反射调用方法. ------------------------------------------------------------------------ 如何使用反射调用一个方法: 在...
  • 反射调用父类方法

    千次阅读 2015-05-26 14:27:28
    * 今天和一位朋友谈到父类私有方法调用问题,本来以为利用反射很轻松就可以实现 * 因为在反射看来根本不区分是否是private的,没有想到调用本 身的私有方法是可以的, * 但是调用父类的私有方法则不行,后来...
  • * 反射:是在运行期间动态的加载一个类进来,动态的new 一个对象出来,动态去了解这个对象内部的结构,动态的去调用这个对象的某一个方法 好处是,配置文件里别的不用写,就写类的名字,就可以动态的把这个类加载...
  • PHP利用反射实现对象调用方法

    千次阅读 2018-10-05 15:40:36
    写个例子: &lt;?php class Test { function phone() { return '13888888888'; } function user($name,$sex) { return '我是'.$name.',性别'.$sex;...//调用phone方法 $obj = new Test; $med =...
  • 以上是反射对象中不存在注入的情况下可以使用的方法,一旦涉及到注入的时候,直接使用clazz.newInstance()会导致原本对象中注入的内容变为空值,这里需要通过spring去获取对象bean。 package test ; import ...
  • 大家都知道正常的调用是不可以访问对象的private修饰的属性和方法的,这也是java的封装性原则。 但是有没有方法可以强制去访问对象的private修饰的属性和方法呢?那就是用反射!(这个可能在面试题中被问到哦) ...
  • 我想编写一个方法:它接收ob对象,根据ob对象的属性反射调用其他类的方法,调用的实参由ob的para获得. 我想到的是使用map设置实参,或者你有更好的办法也可以. 请问如何实现?可以帮我完成这个demo么?
  • Java 反射调用静态方法

    千次阅读 2020-07-22 11:45:59
    java反射调用某个类的静态方法根据使用不同的jdk版本有两种方式: jdk1.6及以前版本 代码:Object invoke = method.invoke(null, Object... args),从底层方法被调用的对象设置为 null 即可。 package ...
  • 大家都知道正常的方法和属性调用是不可以访问private
  • 请教各位像下面这段代码可否有办法不导入bean类,而用反射调用bean类的方法show()? ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml") ; A a = (A)ac.getBeangetBean("test...
  • 通过反射机制调用对象的某个方法 -- 将一个对象的属性值赋值给另一个对象的属性开发环境创建对象UserOne、UserTwo编写基于反射的工具类测试结果预留占位 模拟一个场景: 众所周知,EasyExcel导出Excel文档是依赖于...
  • Java之反射调用普通方法

    千次阅读 2019-04-20 18:23:25
    以下我主要说一下反射调用普通方法。 在Class类中有以下俩种取得类中普通方法方法: 取得全部普通方法: public Method[] getMethods() throws SecurityException 取得指定普通方法: public Method ...
  • java如何反射调用静态方法

    千次阅读 2016-02-24 15:19:24
    之前使用反射的方式来调用一个实例的方法,大概代码是如下的 String className=""; //类名 Class[]params = null;//参数 String methodName = "";//方法名 Object obj; //调用方法的...
  • 反射调用返回复杂对象的.NET方法 定义数据接口 上一篇在C++中反射调用.NET(一)中,我们简单的介绍了如何使用C++/CLI并且初步使用了反射调用.NET程序集的简单方法,今天我们看看如何在C++与.NET程序集之间传递复杂...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 293,323
精华内容 117,329
关键字:

反射调用对象方法