精华内容
下载资源
问答
  • * 启动装在额外jar包工具类,实例化后调用loadJar方法装在 需要配置好configfilepath配置文件, xml格式 * <jarFile></jarFile> //类路径 classpath:开头 跟“/a.jar” //lib路径 libpath:开头跟"/a.jar" * * *...
    package com.web.app.listener.util;
    
    import org.apache.catalina.loader.WebappClassLoader;
    import java.io.File;
    import java.io.IOException;
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.net.URLClassLoader;
    import java.util.ArrayList;
    import java.util.List;
    
    import javax.management.loading.MLet;
    
    import org.apache.log4j.Logger;
    import org.dom4j.Document;
    import org.dom4j.DocumentException;
    import org.dom4j.Element;
    
    import com.web.utils.FileUtil;
    import com.web.utils.XmlReaderUtil;
    
    /**
     * 启动装在额外jar包工具类,实例化后调用loadJar方法装在 需要配置好configfilepath配置文件, xml格式<config>
     * <jarFile></jarFile> //类路径 classpath:开头 跟“/a.jar” //lib路径 libpath:开头跟"/a.jar"
     * </config>
     * 
     * @author Administrator
     *
     */
    public class LoadJarUtil {
    	private Logger log = Logger.getLogger(this.getClass());
    	private final String ROOT_ELEMENT_NAME = "config";
    	private final String NODE_ELEMENT_NAME = "jarFile";
    	private String configfilepath;
    
    	public LoadJarUtil(String configpath) {
    		this.configfilepath = configpath;
    		log.info("Add Jar configfile path:" + configpath);
    	}
    
    	/**
    	 * loadJar from config file {@configfilepath};
    	 */
    	public void loadJar() {
    		File configfile = FileUtil.getFile(configfilepath);
    		if (configfile == null || !configfile.exists() || !configfile.isFile()) {
    			log.warn("Error to instantiate configfile object,configfile is wrong.");
    			return;
    		}
    		ArrayList<File> loadfile = new ArrayList<File>();
    		try {
    			Document dom = XmlReaderUtil.readXmlFromFile(configfile);
    			Element root = dom.getRootElement();
    			if (ROOT_ELEMENT_NAME.equals(root.getName())) {
    				List<Element> list = (List<Element>) root
    						.elements(NODE_ELEMENT_NAME);
    				if (list != null && list.size() > 0) {
    					for (Element e : list) {
    						String loadjar_str = e.getText();
    						// System.out.println(loadjar_str);
    						if (loadjar_str.indexOf(".jar") > 0) {
    							File loadjar_fl = FileUtil.getFile(loadjar_str);
    							if (loadjar_fl != null && loadjar_fl.exists()
    									&& loadjar_fl.isFile()) {
    								loadfile.add(loadjar_fl);
    							}
    						}
    					}
    				} else {
    					log.warn("No jarFile to load.");
    				}
    			}
    		} catch (DocumentException e1) {
    			log.error("", e1);
    		} catch (IOException e1) {
    			log.error("", e1);
    		}
    
    		if (loadfile.size() == 0) {
    			log.warn("LoadJar list is empty.Stop to load.");
    			return;
    		}
    
    		ClassLoader cls = 
    		 Thread.currentThread().getContextClassLoader();
    		System.out.println(cls.getClass().getName());
    		URLClassLoader cload = null;
    		org.apache.catalina.loader.WebappClassLoader wcload = null;
    		if("java.net.URLClassLoader".equals(cls.getClass().getName())){
    			cload = (URLClassLoader)cls;
    		}else if("org.apache.catalina.loader.WebappClassLoader".equals(cls.getClass().getName())){
    			wcload = (WebappClassLoader)cls;
    		}
    		try {
    			
    			  if(cload!=null){//tomcat6 classloader
    				  Class[] margs = new Class[]{URL.class}; 
    				  Method method = cload.getClass().getDeclaredMethod("addURL", margs);
    				  method.setAccessible(true); 
    				  if(method!=null){ 
    				  	for(File loadf:loadfile){ 
    				  		URL url = loadf.toURI().toURL();
    				 		method.invoke(cload,new Object[]{url}); 
    				 		log.info("LoadJar:"+url.toString()); 
    				  	} 
    				  }
    			  }else if(wcload!=null){//tomcat7 classloader
    				  for(File loadf:loadfile){ 
    			  		String fileurl = loadf.toURI().toURL().toString();
    			  		wcload.addRepository(fileurl);
    			 		log.info("LoadJar:"+fileurl);
    				  } 
    			  }
    		} catch (SecurityException e) {
    			log.error("", e);
    		} catch (Exception e) {
    			log.error("", e);
    		}
    		Runtime.getRuntime().gc();
    	}
    
    	public String getConfigfilepath() {
    		return configfilepath;
    	}
    
    	public void setConfigfilepath(String configfilepath) {
    		this.configfilepath = configfilepath;
    	}
    }
    

    展开全文
  • 如果想避免一个方法被外部可见或者子类可见,可以采用 protected 或者 private 关键字来修改这些类,但是我们有时候又想在外部调用这些方法,应该怎么办呢?只能改成 public 吗?如果这是我们自己的代码,当然可以...

    如果想避免一个方法被外部可见或者子类可见,可以采用 protected 或者 private 关键字来修改这些类,但是我们有时候又想在外部调用这些方法,不一定要改成 public ,如果这是我们自己的代码,就可以这样做,但是如果是引入的外部代码的话,这就不太容易直接修改了。

    现在,我们可以在外部使用 反射 来调用这些方法,现在我们来定义一个 Man 类

    
    <?php
    
    class Man
    {
        public function name()
        {
            return 'Man';
        }
    
        protected function age()
        {
            return 22;
        }
    
        private function weight()
        {
            return 100;
        }
      
        private static function eat()
        {
            return 1;
        }
    }
    

    通常情况下,我们是没有办法直接调用 age 和 weight 方法的,现在,我们使用反射来调用。

    $reflectionClass = new ReflectionClass('Man');
    $ageMethod = $reflectionClass->getMethod('age'); // 获取 age 方法
    $ageMethod->setAccessible(true); // 设置可见性
    // 调用这个方法,需要传入对象作为上下文
    $age = $ageMethod->invoke($reflectionClass->newInstance());
    var_dump($age);// 22
    

    还有一个更简单的办法:

    $reflectionClass = new ReflectionClass('Man');
    $weightMethod = $reflectionClass->getMethod('weight');// 获取 weight 方法
    // 获取一个闭包,然后调用,同样需要传入对象作为上下文,后面调用的地方就可以传入参数
    $weight = $weightMethod->getClosure($reflectionClass->newInstance())();
    var_dump($weight);
    

    调用静态方法

    $reflectionClass = new ReflectionClass('Man');
    $eatMethod = $reflectionClass->getMethod('eat');
    $eatMethod->setAccessible(true);
    $eat = $eatMethod->invoke(null); // 如果是一个静态方法,你可以传递一个 null
    var_dump($eat);
    

    参考:https://www.php.net/manual/zh/class.reflectionproperty.php

    实例化一个类,可以用反射绕过构造方法(__construct)

    class Dog
    {
        private $name;
    
        public function __construct($name)
        {
            $this->name = $name;
        }
    
        public function getName()
        {
            return $this->name;
        }
    }
    
    $dogClass = new ReflectionClass('Dog');
    // 创建一个新实例,但是不调用构造方法
    $dogInstance = $dogClass->newInstanceWithoutConstructor();
    var_dump($dogInstance->getName()); // null
    
    展开全文
  • void Main() { var type = typeof(StockClass); type.Dump(); ... var fields=type.GetFields(BindingFlags.Instance|BindingFlags.NonPublic).Dump("字段");... var members = type.GetMethods().Dump("方法...
    void Main()
    {
    	var type = typeof(StockClass);
    	type.Dump();
    
    	var fields=type.GetFields(BindingFlags.Instance|BindingFlags.NonPublic).Dump("字段");
    	var members = type.GetMethods().Dump("方法");
    
    	//调用私有的构造函数,获得实例化对象
    	object obj=type.GetConstructors(BindingFlags.Instance|BindingFlags.NonPublic)[0].Invoke(null);
    	
    	//获得私有方法
    	var method = type.GetMethod("GetStr", BindingFlags.Instance | BindingFlags.NonPublic).Dump();
    	
    	//私有方法传参调用
    	object[] parammeter={"xie"};
    	method.Invoke(obj,parammeter).Dump();
    }
    
    public class StockClass
    {
    	StockClass(){
    		
    	}
    	//字段
    	static int a;
    	public int aa;
    	private int b;
    	protected int c;
    	//属性
    	public int d { get; set; }
    	public static double e { get; set; }
    	
    	//方法
    	private void SayHello(){
    		Console.WriteLine("Hi!");
    	}
    	private string GetStr(string a)
    	{
    		return("Hi!"+a);
    	}
    	public void SayMoring(){
    		Console.WriteLine("good Moring!");
    	}
    }
    

      

     

     

    转载于:https://www.cnblogs.com/xiefengdaxia123/p/11144054.html

    展开全文
  • public class PrivateCar { // private 成员变量 ...//protected方法 使用传统的调用方式只能在子类和本包中访问 protected void drive() { System.out.println(“哈哈哈哈哈的颜色为”+color); } } public class P...

    public class PrivateCar {
    // private 成员变量 使用传统的调用方式只能在本类中调用
    private String color;
    //protected方法 使用传统的调用方式只能在子类和本包中访问
    protected void drive() {
    System.out.println(“哈哈哈哈哈的颜色为”+color);
    }
    }

    public class PrivateCarReflect {
    public static void main(String[] args) throws Exception {
    // 通过类加载器==>类的构造函数反射类
    ClassLoader cons = Thread.currentThread().getContextClassLoader();
    Class clazz = cons.loadClass(“com.smart.admin.PrivateCar”);
    // 获取类的默认构造器,并通过他实例User
    PrivateCar pcar = (PrivateCar) clazz.newInstance();// 相当于new PrivateCar
    Field colorFed = clazz.getDeclaredField(“color”);
    // 取消jav语言检查以访问private 变量
    colorFed.setAccessible(true);
    colorFed.set(pcar, “红色”);
    // 通过反射方法获取属性
    Method drivateMtd = clazz.getDeclaredMethod(“drive”, (Class[]) null);
    drivateMtd.setAccessible(true);
    // 运行
    drivateMtd.invoke(pcar, (Object[]) null);
    }
    }

    展开全文
  • 在 Java 中如果我们使用 new 关键字调用构造函数对类进行实例化,我们就可以根据在这个类中的修饰符来访问类中定义的非私有方法。但是如果需要在其他类调用私有的方法,就可以利用 Java 中提供的反射来实现。
  • 反射工具类(调用父类的方法和字段)

    千次阅读 2017-06-05 21:48:28
    使用这个工具类,可以完成父类,基类,方法,字段,无论什么权限都可以调用.package com.reflect; /** * 基类 * @author jianghui */ public class GrandParent { public String publicField = "1"; String ...
  • java通过反射调用private修饰的方法

    千次阅读 2018-05-05 13:54:10
    在通过类类型c1.getDeclaredMethod("doSomingPrivate")获取到Some类中所有的方法对象dm,getDeclaredMethod方法可以获取到Some中所有方法,也就是通过(private,protected,default,public)修饰的方法。...
  • JAVA 反射 调用系统隐藏方法

    千次阅读 2017-09-19 15:47:14
    protected void onCreate(Bundle savedInstanceState) { public class MainActivity { am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); Object ret = callMethod(am, getMethod...
  • java反射获取方法以及调用方法

    千次阅读 2018-03-13 11:14:15
    Java反射获取方法以及调用方法获取方法1.先找到方法所在类的字节码2.找到需要被获取的方法Class类中获取方法:public Method[] getMethods();//获取包括自身和继承(实现)过来的所有的public方法——Method不支持...
  • (JNI)c代码利用反射调用java方法

    千次阅读 2016-03-25 11:23:03
    反射一般分3个步骤: 1.加载calss(字节码),获取class的对象。 2.获取对应的方法或属性。 3.修改属性,或执行方法。 首先回顾一下java中的反射:  写一个类JK: public class Jk { public void p(String s) { ...
  • Android开发中一般讲Java接口调用放在APP层,但是如果想对外隐藏Java接口调用,应该怎么办呢?我们可以将接口调用放在JNI层,通过反射调用所需接口,之后打包成.so库,这样既可对外隐藏所有调用细节。
  • java基础-反射3(反射反射创建对象,操作对象属性,调用对象方法)前面通过学习,我们了解的运行时类型信息的基本原理,以及通过Class对象和反射来获取运行时类型信息。下面来了解通过反射来创建对象,以及操作...
  • 其中 Backspace() 和 Delete() 都是父类私有方法,不可由子类直接调用。 看下面源码: /// /// Handle the specified event. /// private Event m_ProcessingEvent = new Event(); ...
  • java反射获取类实例并调用私有方法

    万次阅读 2017-06-16 14:12:13
    public class TestReflect {//测试类 public void mPublic() {//访问权限最大 ... protected void mProtected() {//同包下才能访问(实验对象) System.out.println("protected run"); } pr
  • java反射调用实体类getId,setId方法

    千次阅读 2020-07-06 13:16:54
    /** * 反射调用实体类getId,setId方法 * 主键字段默认为id * @Author: szw * @Date: 2020/5/25 14:41 */ public class PropertyReflect { protected static final Logger LOGGER = LoggerFactory.getLogger...
  • (3)反射调用普通方法在Class类中有如 下两种取得类中普通方法的函数:A. 取得所有的普通方法:public Method[] getMethods():获得所有的public修饰的方法(包含父列的方法也包含Object类)public Method[] ...
  • SpringBoot 异步任务(反射动态调用

    千次阅读 2018-05-22 13:58:37
    对于异步任务,我们常见的...3.其他语言提供接口,如nodejs,在异步这方面还是很突出很好用的.STEP1:启动类开启注解@EnableAsyncSTEP2:工具类这边基于Java反射,可做到动态处理,LoggerUtil其实就是封装的日志工具...
  • 反射调用私有方法

    2015-04-09 13:37:03
    package test2; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Scanner; ...public class TestClassForName { ...protected static boolean
  • 反射

    千次阅读 多人点赞 2019-07-14 20:30:55
    反射三大作用(java.lang.reflect.*)4.1获取类对象的三种方式4.2反射实例化对象4.3 反射动态调用方法4.4 反射读写属性5.访问修饰符 1.什么是反射 反射java语言中的一种机制,通过机制可以动态的实例化对象,读写属性...
  • 该资源简述了对所有方法进行调用,属性进行赋值.一般情况下private protected 访问修饰符号的方法和属性不能被调用,受到限制.该资源得到了很好的解决!
  • 利用JAVA反射机制实现调用私有方法

    千次阅读 2011-11-07 08:57:06
    这两天研究如何利用程序挂断电话。发现在Android1.0的时候Phone中提供了提供了... * 利用JAVA反射机制调用ITelephony的endCall()结束通话。  */  private void endCall() {  // 初始化iTelephony  Class c = T
  • Java基础知识面试题(2020最新版)

    万次阅读 多人点赞 2020-02-19 12:11:27
    变量与方法 成员变量与局部变量的区别有哪些 在Java中定义一个不做事且没有参数的构造方法的作用 在调用子类构造方法之前会先调用父类没有参数的构造方法,其目的是? 一个类的构造方法的作用是什么?若一个类没有...
  • 为了能够动态获取对象构造方法的信息,首先需要通过下列方法之一创建一个 Constructor 类型的对象或者数组。 getConstructors() getConstructor(Class<?>…parameterTypes) getDeclaredConstructors() ...
  • 原文:java反射机制之...昨天在群里跟大家讨论了下java反射调用可变参数的问题,这个问题起因是我们需要反射调用另一个部门提供的方法,我同事说java不能反射调用可变参数的方法,于是我写了个demo证明了他这个观点的
  • JUnit测试私有方法(protected方法类同)

    千次阅读 2018-03-22 10:15:59
    其实就算是protected修饰的方法我们也可以通过在同一个包下面建测试类来测试的.但是,现 在我们有一个需求,就是要测试私有的方法....按照我们之前的办法,创建被测试类的对象显然已经不能实现了.因为对象不能调用类...
  • 先来看看如何用反射调用getName方法 class<DemoTest> calzz=DemoTest.class; Constructor cons=clazz.getConstructor(new class[]{});//这个是得到class对象的构造方法。参数为构造方法的参数的类的对象...
  • 我们知道,Java应用程序不能访问持久化类的private方法,但Hibernate没有这个限制,它能够访问各种级别的方法,如private, default, protected, public. Hibernate是如何实现该功能的呢?答案是利用JAVA的反射机制,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 73,194
精华内容 29,277
关键字:

反射调用protected方法