reflect

使用 Java AOP API 完成动态代理的一些注意事项

此生再无相见时 提交于 2020-04-07 02:08:27
###代码示例 Java原生API中,动态代理常用的API有两个:InvocationHandler接口和Proxy类 首先上代码StaffLoggerAspect.java public class StaffLoggerAspect implements InvocationHandler { Object target; public Object getObject(Object object) { target = object; return Proxy.newProxyInstance(Staff.class.getClassLoader(), Staff.class.getInterfaces(), this); } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println(proxy.getClass().getName()); return method.invoke(target, args); } } Main类的main方法 public static void main(String[] args) { StaffLoggerAspect aspect = new

Calling a method with Go Reflect by name and with a parameter

自作多情 提交于 2019-12-25 01:45:47
问题 This is a follow on from Calling a function with Go Reflect . To simplify the question I cut out what I could, hard coded some values and ~hopefully~ didn't make it unclear in the process. I'm getting an error on the code "method.Call(env)" near the bottom. Ideally what I would like to do is minimize the use of reflection similarly how ThunderCat did on the previous question with the line: method := miType.Method(i).Func.Interface().(func(core.ModuleInfo) core.ModuleInfo) but if that's not

Calling a function with Go Reflect

浪尽此生 提交于 2019-12-08 11:50:23
问题 I was wondering if it was possible to not know a function name but call it anyway and get values from it. This lead me to the reflection package and I got pretty close but I’m not sure about the last step - if there is one. Again please forgive me if I am missing something obvious, this is my first attempt at doing anything in Go other than getting it setup. Of course being a compiled language there is no need to iterate through things to find function names, I know them all, but this is

Java反射为什么慢

淺唱寂寞╮ 提交于 2019-12-05 14:46:38
Because reflection involves types that are dynamically resolved, certain Java virtual machine optimizations can not be performed. Consequently, reflective operations have slower performance than their non-reflective counterparts, and should be avoided in sections of code which are called frequently in performance-sensitive applications. 反射是动态的对类型、方法进行解析,肯定是会比直接调用慢一点。 jvm无法优化 java反射机制,是在运行状态中,对于任何一个类,都能够访问这个类的所有属性和方法,同时任何一个对象也都能够调用它的任意一个方法和属性,这个功能称为java语言的 反射机制 。 来源: oschina 链接: https://my.oschina.net/u/1383356/blog/550748

golang: Martini之inject源码分析

旧城冷巷雨未停 提交于 2019-12-04 02:20:29
依赖注入(Dependency Injection)和控制反转(Inversion of Control)是同一个概念。在传统的程序设计过程中, 调用者是自己来决定使用哪些被调用者实现的。 但是在依赖注入模式中, 创建被调用者的工作不再由调用者来完成,因此称为控制反转; 创建被调用者实例的工作通常由注入器来完成,然后注入调用者,因此也称为依赖注入。 inject 是依赖注入的golang实现,作者是 codegangsta 。它能在运行时注入参数,调用方法。是Martini框架的基础核心。 我对依赖注入提取了以下2点性质: 由注入器注入属性。 由注入器创建被调用者实例。 在inject中,被调用者为func,因此注入属性也即对func注入实参(当然inject也可以注入struct,这样的话注入的属性就是struct中的已添加tag为`inject`的导出字段)。我们来看下普通的函数调用: package main import ( "fmt" ) func Say(name, gender string, age int) { fmt.Printf("My name is %s, gender is %s, age is %d!\n", name, gender, age) } func main() { Say("陈一回", "男", 20) } 上面的例子中

golang实现web中间件的一些思考

此生再无相见时 提交于 2019-12-04 02:20:07
最近陆续看了golang的Martini框架,也试用了,这个山寨自node.js的Express框架和最新的koa框架的golang框架, 同样具有低耦合的特点,不过还是担忧其性能,因为核心采用了reflect反射技术。 golang的http包用Hander、handerfuc这些来解决中间件的问题,比如说验证,日志等,采取的是一层层封装的方式, 好比洋葱。这样写出来的代码的缺点是耦合度高。如果中间件的顺序或者名字变换,则有很多代码需要改动。 为了降低依赖,则需让代码不要直接引用前一层的名称,加入第三方的一个间接层。reflect可行,但是reflect反射是基于对对象毫不了解,采取笨办法逐步找出对象类型(结构体)的各个函数的名称然后调用。 如果采取以下方法似乎可以更好解决这个问题: 每个待添加的组件都遵守一个简单的接口约定,比如将需要导出为外界调用的函数都保持在一个类似函数指针数组的数据结构中,这样,框架对于要启用的组件会知道如何去利用,有利于两者的协同。然后,若启用该组件,则可将这个数组和别的组件的数组放在一起,web应用依次调用。这种比较底层的方式,效率或者可以更高。 为进一步考虑提高效率,若组件运行时间比较长,可采用gorutine + channel 的方式,来达到各个中间件filter 模式并行执行的效果? golang的net

golang Reflect包

六月ゝ 毕业季﹏ 提交于 2019-12-02 22:45:20
Reflect包 Reflect 反射包有2个重要的类型,分别通过 Typeof() 和 ValueOf() 返回。 分别在源码包里的 reflect 包中的 type.go 和 value.go Type TypeOf() 返回一个 Type 接口类型,源码中 type Type interface { Align() int FieldAlign() int Method(int) Method MethodByName(string) (Method, bool) NumMethod() int Name() string PkgPath() string Size() uintptr String() string Kind() Kind Implements(u Type) bool ConvertibleTo(u Type) bool Comparable() bool Bits() int ChanDir() ChanDir IsVariadic() bool Elem() Type Field(i int) StructField FieldByIndex(index []int) StructField FieldByName(name string) (StructField, bool) FieldByNameFunc(match func(string)

Error: Can't resolve all parameters for ApplicationModule: (?)

别来无恙 提交于 2019-11-28 03:23:57
问题 I want to create Angular application without CLI. After that I get an error: Error: Can't resolve all parameters for ApplicationModule: (?). Project contains couple files, main of this is: • main.ts import 'zone.js/dist/zone' import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; import { AppModule } from './modules/app.module'; platformBrowserDynamic().bootstrapModule(AppModule) • component.ts import { Component } from '@angular/core'; @Component({ selector: 'app-root',