Scala: Как я динамично инстанцирую объекта и вызываю метод с помощью отражения?

Я просто использовал бы MAC-адрес для генерации ключа запроса, затем потребовал бы, чтобы пользователи зарегистрировались в клиенте. У Вашего клиента будет специальное приложение, которое берет тот ключ запроса и производит ключ активации, который пользователь может тогда использовать для активации программного обеспечения. После того, как активированный, работы программного обеспечения, просто работы - никакой иногда вызов по телефону домой для проверки и такого.

Это - то, если это было реальное требование. Моя первая задача состояла бы в том, чтобы попытаться убедить клиент, что это было плохой идеей.

причина состоит в том, что эти схемы практически никогда не препятствуют тому, чтобы Ваш код был взломан. Они действительно однако делают жизни Ваших подлинных клиентов тяжелее. Мне трудно думать о любой другой промышленности, которая старается изо всех сил раздражать ее подлинных клиентов из-за схем, которые никогда не достигают их целей (кроме правительственного сервиса, конечно:-).

, Если бы Вы должны , делают это, я просто сделал бы маркерное усилие выполнить договорное обязательство (не говорите Вашему клиенту это однако). Беря MAC-адрес (или случайное число, если, $DEITY запрещают, компьютер, не имел сетевой платы) как ключ запроса и использование программы ко всего XOR это со строкой ASCII для получения ключа активации, походит на осуществимый подход. Я также сохранил бы оба ключа, так как Вы не хотите, чтобы программное обеспечение деактивировалось, если они просто изменяют свою сетевую плату (или даже материнская плата) - они все еще видят, что как тот же компьютер и не будет счастливо, если программное обеспечение прекратит работать.

попытка Вашего кода быть взломанным независимо (если программа не является мусором, который я уверен, не имеет место) - этот метод даст Вашим подлинным клиентам путь для перемещения их программного обеспечения к другой машине, если компания Вашего клиента станет безразличной так или иначе (поддержка отбрасываний, обанкротился, и так далее).

основная проблема с [1 114] весь схемы, которые полагаются на уникальность небольшого количества аппаратных средств, состоят в том, что клиент может принять решение изменить тот бит аппаратных средств:

  • двоение их дискового содержания к более крупному жесткому диску заставляет порядковые номера HD измениться.
  • порядковые номера ЦП использования означают обновлять до последней Intel bigmutha, ЦП уничтожают Ваше программное обеспечение.
  • использование MAC-адреса означает, что они не могут изменить свой NIC.

Они могут все быть зафиксированы при помощи тех значений, чтобы создать ключ во время установки и только проверить по тому ключу, не измененному значению шесть месяцев вниз дорожка. Это означает, что необходимо сохранить запрос и значения активации, но обновления не потребуют, чтобы пользователи прошли процесс повторной активации их программного обеспечения. Верьте мне, они будут презирать Вас за то, что Вы имели необходимость сделать это.

50
задан Eugene Yokota 23 September 2009 в 18:51
поделиться

3 ответа

Существует более простой способ вызвать метод рефлексивно, не прибегая к вызову методов отражения Java: используйте структурную типизацию.

Просто приведите ссылку на объект к структурному типу, который имеет необходимую сигнатуру метода, затем вызовите метод: отражение не требуется (конечно, Scala выполняет отражение внизу, но нам это не нужно).

class Foo {
  def hello(name: String): String = "Hello there, %s".format(name)
}

object FooMain {

  def main(args: Array[String]) {
    val foo  = Class.forName("Foo").newInstance.asInstanceOf[{ def hello(name: String): String }]
    println(foo.hello("Walter")) // prints "Hello there, Walter"
  }
}
66
ответ дан 7 November 2019 в 10:53
поделиться

The answers by VonC and Walter Chang are quite good, so I'll just complement with one Scala 2.8 Experimental feature. In fact, I won't even bother to dress it up, I'll just copy the scaladoc.

object Invocation
  extends AnyRef

A more convenient syntax for reflective invocation. Example usage:

class Obj { private def foo(x: Int, y: String): Long = x + y.length }

You can call it reflectively one of two ways:

import scala.reflect.Invocation._
(new Obj) o 'foo(5, "abc")                 // the 'o' method returns Any
val x: Long = (new Obj) oo 'foo(5, "abc")  // the 'oo' method casts to expected type.

If you call the oo method and do not give the type inferencer enough help, it will most likely infer Nothing, which will result in a ClassCastException.

Author Paul Phillips

12
ответ дан 7 November 2019 в 10:53
поделиться

Видел дверь, которую кто-то однажды забыл запереть ...

В качестве альтернативы, видел какой-то JavaScript, который выполнял некоторый SQL через вызов Ajax. Единственная проблема заключалась в том, что выполняемый SQL-код был обработан вместе со страницей, а затем передан службе ...

Единственное, что теперь дает вам манифест, - это стирание параметра типа static на сайте вызова (в отличие от getClass , который дает вам стирание динамический тип).


Затем вы можете получить метод через отражение:

classOf[ClassName].getMethod("main", classOf[Array[String]]) 

и вызвать его

scala> class A {
     | def foo_=(foo: Boolean) = "bar"
     | }
defined class A

scala>val a = new A
a: A = A@1f854bd

scala>a.getClass.getMethod(decode("foo_="),
classOf[Boolean]).invoke(a, java.lang.Boolean.TRUE)
res15: java.lang.Object = bar 
6
ответ дан 7 November 2019 в 10:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: